בונים כלי לניתוח CSV בפייתון - המיומנות ששווה יותר ממה שנראה לכם¶
תעצרו רגע ותחשבו כמה פעמים ראיתם מישהו בעבודה מתעסק ידנית עם קובץ אקסל ענק - ממיין עמודות, מוחק שורות, מחשב סכומים עם מחשבון צד. עכשיו תדמיינו שכל זה קורה בשנייה וחצי עם סקריפט פייתון של עשרים שורות. זה בדיוק מה שאנחנו בונים כאן, וזו לא תרגיל אקדמי - זו אחת המיומנויות הכי ישירות ושמישות שתכנות נותן לכם, כי כמעט כל ארגון מייצא נתונים ל-CSV בשלב כלשהו.
הפרויקט הזה שונה מפרויקטים אחרים למתחילים כי הוא לא סגור ומוגדר מראש - הנתונים האמיתיים תמיד מלוכלכים, חסרים, ולא עקביים, וההתמודדות עם זה היא בדיוק מה שהופך מתכנת ממתחיל למישהו שיודע לעבוד עם העולם האמיתי.
שלב ראשון - קריאה שלא קורסת¶
הפיתוי הראשון הוא לפתוח את הקובץ ולהתחיל לעבוד. אבל קבצי CSV אמיתיים אוהבים להפתיע - שורה עם פסיק בתוך שדה טקסט, קידוד לא אחיד, כותרת עמודה עם רווח מיותר. לכן הצעד הראשון הוא תמיד קריאה זהירה, לא קריאה אופטימית:
import csv
with open("data.csv", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
rows = list(reader)
DictReader הוא הבחירה הנכונה כאן, כי הוא הופך כל שורה למילון לפי שמות העמודות, במקום רשימה של ערכים לפי מיקום. זה אומר שאם מישהו יוסיף עמודה חדשה לקובץ בעתיד, הקוד שלכם לא נשבר - הוא פשוט מתעלם ממנה, במקום להזיז את כל האינדקסים.
שלב שני - pandas או המודול המובנה?¶
יש כאן החלטה אמיתית. המודול csv המובנה מספיק לגמרי בשביל קבצים קטנים ובינוניים, והוא נהדר ללימוד כי אתם רואים בדיוק מה קורה עם כל שורה. pandas, לעומת זאת, היא ספרייה חיצונית שהופכת פעולות כמו סינון, קיבוץ וחישובים סטטיסטיים לשורה אחת:
ההמלצה שלי - אם זו הפעם הראשונה שלכם עם ניתוח נתונים, תתחילו עם המודול המובנה כדי להבין מה קורה מתחת למכסה המנוע. ברגע שהבנתם למה groupby עושה, תעברו ל-pandas ותיהנו מכמה שהוא חוסך לכם. לקפוץ ישר ל-pandas בלי להבין את הבסיס גורם להרבה מתחילים "לזרוק קוד" בלי להבין למה הוא עובד.
שלב שלישי - ניקוי נתונים¶
זה השלב שאף אחד לא מדבר עליו מספיק, והוא בפועל תופס הכי הרבה זמן בעבודה עם נתונים אמיתיים. שדה מספרי שהגיע כמחרוזת ריקה, תאריך שכתוב בשלושה פורמטים שונים בתוך אותו קובץ, רווחים מיותרים בתחילת שם - כל אלה שוברים חישובים בשקט, בלי הודעת שגיאה, פשוט עם תוצאה שגויה.
def clean_amount(value):
try:
return float(value.strip().replace(",", ""))
except (ValueError, AttributeError):
return None
הרגל טוב הוא לטפל בכל ערך חשוד באופן מפורש ולהחליט מה קורה איתו - להשליך את השורה, למלא ערך ברירת מחדל, או לסמן אותה לבדיקה ידנית. השקט הכי מסוכן בעבודה עם נתונים הוא כשקוד "עובד" בלי שגיאות אבל נותן תשובה לא נכונה כי מישהו לא טיפל בערך חסר.
שלב רביעי - אגרגציה וסיכומים¶
עכשיו מגיע החלק המספק - להפוך שורות גולמיות למידע שימושי. סכום כולל, ממוצע, ערך מקסימלי, קיבוץ לפי קטגוריה או תאריך. עם המודול המובנה זה נראה כך:
totals = {}
for row in rows:
cat = row["category"]
totals[cat] = totals.get(cat, 0) + clean_amount(row["amount"])
for cat, total in sorted(totals.items(), key=lambda x: -x[1]):
print(f"{cat}: {total:.2f}")
שימו לב לשימוש ב-sorted עם key - זו טכניקה שתשתמשו בה שוב ושוב בכל פעם שתצטרכו לסדר תוצאות לפי ערך מסוים, לא לפי הסדר שבו הן הגיעו.
שלב חמישי - סינון וייצוא דוח¶
תוסיפו אפשרות סינון - למשל להציג רק הוצאות מעל סכום מסוים, או רק מחודש מסוים. ואז תייצאו את הסיכום לקובץ CSV חדש או אפילו לקובץ טקסט מעוצב. זה הופך את הכלי מסקריפט חד פעמי לכלי שאפשר להריץ שוב ושוב על קבצים חדשים, וזה בדיוק ההבדל בין "כתבתי קוד" ל"בניתי כלי".
למה זו מיומנות ששווה כסף¶
כל תפקיד שנוגע בנתונים - שיווק, כספים, מוצר, תמיכה - מתמודד עם קבצי CSV מתישהו. היכולת לכתוב כמה שורות פייתון שחוסכות שעתיים של עבודה ידנית באקסל היא לא רק מיומנות תכנות, היא כלי שממצב אתכם כמישהו שפותר בעיות אמיתיות בארגון, גם אם התפקיד שלכם לא "מתכנת" רשמית.
הבסיס לכל זה הוא שליטה טובה במבני נתונים כמו מילונים ורשימות, שזה בדיוק מה שמלמדים בקורס תכנות בסיסי החינמי שלנו לפני שקופצים לספריות מתקדמות.
אם אתם רוצים להגיע לרמה שבה כלי כזה נראה לכם פשוט לבנות, קורס תכנות בסיסי הוא המקום הנכון להתחיל, בחינם ובעברית.