מערך שיעור: Modules, Packages וקבצים
משך: יום לימוד מלא — 6 שעות אקדמיות (270 דקות).
מטרת השיעור: הסטודנטים ילמדו לארגן פרויקט במספר קבצים ותיקיות, ולשמור מידע על ה-Storage כך שישרוד בין הרצות: בטקסט, ובעיקר ב-JSON.
בסוף השיעור הסטודנטים צריכים:
- לפרק קוד למודולים ול-Package, לייבא בשלוש הצורות ולהשתמש ב-
if __name__ == "__main__":. - לקרוא ולכתוב קבצי טקסט עם
with, לבחור את מצב הפתיחה הנכון, ולבנות נתיב עמיד עםPath(__file__). - לשמור ולטעון נתונים ב-JSON בתבנית “טען → שנה → שמור”, כולל טיפול בקובץ חסר או פגום.
דגש קריטי: JSON ↔ dict. הסטודנטים צריכים להרגיש ש-JSON הוא “dict בקובץ / ברשת”. זה הבסיס לפרויקט של נושא OOP ולכל ה-API בנושא Backend ומסדי נתונים.
מהלך השיעור
| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| Modules ו-import | 40 דק' | פרויקט shop. להדגים קוד ברמה הראשית שרץ בייבוא, ואת מלכודת random.py. |
Packages ו-__name__ | 40 דק' | name_demo בשתי הרצות. Package inventory. python -m. |
| הפסקה | 15 דק' | |
| קבצי טקסט ו-with | 45 דק' | diary.py עם w מול a. run_counter.py סוגר מעגל עם נושא מחשב, מערכת הפעלה ורשת. grades_report.py. |
| JSON | 45 דק' | save_profile, contacts_db. להראות את הקובץ שנוצר ב-VS Code. loads/dumps כהכנה ל-API. |
| הפסקה | 15 דק' | |
| תרגול + Mini Project | 60 דק' | ספרייה מחולקת למודולים. מי שמסיים מהר: להוסיף 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): “אני רוצה לשמור פרטים על סטודנטים: שם, רשימת ציונים, כתובת עם עיר ורחוב, והאם הוא פעיל. הציעו איך לשמור את זה בקובץ טקסט, כך שאפשר יהיה לקרוא את זה בחזרה.”
מהלך:
- כל זוג מציע פורמט:
Dana|90,85|Haifa;Herzl 10|yes, או שורות נפרדות לכל שדה, וכו'. - לשאול: “מה קורה אם בשם הרחוב יש
|או,? איך יודעים איפה נגמרת רשימת הציונים? ואם צוות אחר כותב בשפה אחרת, הוא יבין את הפורמט שלכם?” - כל פורמט “פרטי” צריך מפענח משלו, עם באגים משלו.
- להציג את אותו מידע ב-JSON, ואת
json.dump/json.load: שתי שורות.
מה המרצה מראה בסוף: את קובץ ה-JSON פתוח לצד ה-dict ב-Python, עם חצים בין true ל-True ובין null ל-None. ואז, טיזר לנושא Backend ומסדי נתונים: את אותו JSON בדיוק בתשובה של API אמיתי בדפדפן (למשל https://api.github.com/users/octocat). משפט סיום: “JSON הוא השפה שבה תוכנות מדברות זו עם זו — היום שמרנו בה לקובץ, בעוד שבועיים נשלח בה בקשות לשרת.”