מודולים, קבצים ו-JSON מערך שיעור למרצה

מערך שיעור: Modules, Packages וקבצים

משך: יום לימוד מלא — 6 שעות אקדמיות (270 דקות).

מטרת השיעור: הסטודנטים ילמדו לארגן פרויקט במספר קבצים ותיקיות, ולשמור מידע על ה-Storage כך שישרוד בין הרצות: בטקסט, ובעיקר ב-JSON.

בסוף השיעור הסטודנטים צריכים:

  1. לפרק קוד למודולים ול-Package, לייבא בשלוש הצורות ולהשתמש ב-if __name__ == "__main__":.
  2. לקרוא ולכתוב קבצי טקסט עם with, לבחור את מצב הפתיחה הנכון, ולבנות נתיב עמיד עם Path(__file__).
  3. לשמור ולטעון נתונים ב-JSON בתבנית “טען → שנה → שמור”, כולל טיפול בקובץ חסר או פגום.

דגש קריטי: JSON ↔ dict. הסטודנטים צריכים להרגיש ש-JSON הוא “dict בקובץ / ברשת”. זה הבסיס לפרויקט של נושא OOP ולכל ה-API בנושא Backend ומסדי נתונים.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
Modules ו-import40 דק'פרויקט shop. להדגים קוד ברמה הראשית שרץ בייבוא, ואת מלכודת random.py.
Packages ו-__name__40 דק'name_demo בשתי הרצות. Package inventory. python -m.
הפסקה15 דק'
קבצי טקסט ו-with45 דק'diary.py עם w מול a. run_counter.py סוגר מעגל עם נושא מחשב, מערכת הפעלה ורשת. grades_report.py.
JSON45 דק'save_profile, contacts_db. להראות את הקובץ שנוצר ב-VS Code. loads/dumps כהכנה ל-API.
הפסקה15 דק'
תרגול + Mini Project60 דק'ספרייה מחולקת למודולים. מי שמסיים מהר: להוסיף return_book ופקודת חיפוש.
בדוק את עצמך10 דק'

דגשים להעברת השיעור

  • לסגור מעגלים מוקדמים: memory_test.py מנושא מחשב, מערכת הפעלה ורשת (מונה שתמיד 1), ו-FileNotFoundError מ-Current Working Directory. היום שניהם נפתרים, וזה רגע של “אהה”.
  • Path(__file__).parent — להציג כ"נוסחה קבועה" לכל קובץ נתונים. לא צריך להעמיק ב-pathlib.
  • מצב "w" מוחק — להדגים בפועל את מחיקת המידע. זה רגע שזוכרים.
  • encoding="utf-8" — בכיתה עם Windows, להראות מה קורה עם עברית בלי קידוד.
  • __init__.py — להציג גם כריק, וגם כ"חלון ראווה" שחושף את ה-API של ה-Package. לא להעמיק בייבוא יחסי (from . import x), כי זה מבלבל בשלב הזה.
  • JSON: להראות שהקובץ הוא טקסט רגיל, לפתוח, לערוך ידנית, לשבור בכוונה, ולראות את JSONDecodeError.
  • Generator expression במיני-פרויקט (max(book["id"] for book in books)) — אם עולות שאלות, להראות את החלופה בלולאה רגילה.

מושגים

מושגהסבר קצר
Moduleקובץ .py שאפשר לייבא ממנו.
import / from / asייבוא מודול / ייבוא שמות / כינוי.
Packageתיקייה של מודולים עם __init__.py.
__init__.pyרץ בייבוא הראשון של ה-Package. יכול לחשוף שמות.
__name__"__main__" בהרצה ישירה, שם המודול בייבוא.
python -mהרצת מודול לפי שם (מתוך Package).
__pycache__Bytecode שמור של מודולים שיובאו.
open / mode r, w, aפתיחת קובץ / קריאה, כתיבה שמוחקת, הוספה.
withסגירה אוטומטית של הקובץ, גם בשגיאה.
\nתו ירידת שורה.
encoding utf-8קידוד שתומך בכל השפות.
Path(__file__).parentהתיקייה של הסקריפט. בסיס לנתיב עמיד.
JSONפורמט טקסט סטנדרטי לנתונים מובנים.
Serialization / Deserializationנתונים → טקסט / טקסט → נתונים.
dump / load / dumps / loadsקובץ / קובץ / מחרוזת / מחרוזת.
JSONDecodeErrorשגיאה בפענוח JSON לא תקין.

תרגיל חשיבה

שאלת פתיחה (לפני JSON): “אני רוצה לשמור פרטים על סטודנטים: שם, רשימת ציונים, כתובת עם עיר ורחוב, והאם הוא פעיל. הציעו איך לשמור את זה בקובץ טקסט, כך שאפשר יהיה לקרוא את זה בחזרה.”

מהלך:

  1. כל זוג מציע פורמט: Dana|90,85|Haifa;Herzl 10|yes, או שורות נפרדות לכל שדה, וכו'.
  2. לשאול: “מה קורה אם בשם הרחוב יש | או ,? איך יודעים איפה נגמרת רשימת הציונים? ואם צוות אחר כותב בשפה אחרת, הוא יבין את הפורמט שלכם?”
  3. כל פורמט “פרטי” צריך מפענח משלו, עם באגים משלו.
  4. להציג את אותו מידע ב-JSON, ואת json.dump / json.load: שתי שורות.

מה המרצה מראה בסוף: את קובץ ה-JSON פתוח לצד ה-dict ב-Python, עם חצים בין true ל-True ובין null ל-None. ואז, טיזר לנושא Backend ומסדי נתונים: את אותו JSON בדיוק בתשובה של API אמיתי בדפדפן (למשל https://api.github.com/users/octocat). משפט סיום: “JSON הוא השפה שבה תוכנות מדברות זו עם זו — היום שמרנו בה לקובץ, בעוד שבועיים נשלח בה בקשות לשרת.”