Coding for KidsCoding for Kids
שלבים יצירתייםאתגריםמדריך למורים
הצבע על תכונות
קורס פיתוח מתקדם בפייתון
פרק
>
רמה

מודולי סיריאליזציה
מודולי מרשל ופיקל

מטרה

עבור לתחנת השירות וודא שהנתונים מאוחסנים כהלכה באמצעות מודול JSON לעיצוב הקבצים.

בעוד אנו ממשיכים לאורך השביל, אנו מוצאים מספר תחנות המנטרות את חלוקת המים ואיכות הקרקע עבור השטח שמתפתח לקראת קצירה עתידית. כדי לעבד את הנתונים, יעיל לבצע סידור (serialization) של הנתונים. בעוד ששימוש ב-Json יכול להיות יעיל כפתרון כללי, קיימות גם מספר שיטות סידור ייחודיות לפייתון, כגון מודולים Marshal ו-Pickle. מודול ה-Marshal נועד לבצע סידור/ביטול סידור מהיר על ידי המרת הנתונים לבינארי, דבר אידיאלי להעברות נתונים פשוטות. מודול ה-Pickle איטי יותר אך נועד לעבד מבני נתונים מורכבים והוא הרבה יותר גמיש, אידיאלי למבני נתונים גדולים או בעלי עדיפות.

כדי להשתמש במודולי Marshal ו-Pickle, יש לייבא את הפונקציות שלהם על ידי כתיבת: import marshal ו- import pickle. לצרכינו, נשתמש בפונקציות הבאות:

  • marshal.dumps(): ממיר את הנתונים לפורמט בינארי, נועד למהירות בפייתון. מקבל ארגומנט אחד, שהינו הנתונים אותם ברצונך לסדר, ומוגבל לסוגי נתונים בסיסיים.
  • marshal.loads(): מבטל את הסידור של נתונים בינאריים חזרה לסוגי נתונים קריאים בפייתון, מוגבל ביכולותיו אך מבצע באופן מהיר. מקבל ארגומנט אחד, שהוא הנתונים אותם יש לבטל את סידורם.
  • pickle.DEFAULT_PROTOCOL: בודק איזו גרסת פרוטוקול לסידור באמצעות Pickle היא ברירת המחדל בגרסת הפייתון שלך. הפרוטוקולים משפיעים על אופן סידור הנתונים.
  • pickle.HIGHEST_PROTOCOL: בודק איזו גרסת פרוטוקול לסידור באמצעות Pickle היא הגבוהה ביותר הזמינה בגרסת הפייתון שלך. הפרוטוקולים משפיעים על אופן סידור הנתונים.
  • pickle.dumps(): מסדר מבני נתונים מורכבים בפייתון לפורמט בינארי בהתאם לפרוטוקול הנבחר. מקבל שני ארגומנטים, הנתונים אותם ברצונך לסדר וגרסת הפרוטוקול שברצונך להשתמש בה בסידור.
  • pickle.loads(): מבטל את הסידור של נתונים בינאריים חזרה לסוגי נתונים קריאים בפייתון, בעל יכולת עיבוד גבוהה עבור אובייקטים בפייתון. מקבל ארגומנט אחד, שהוא הנתונים אותם ברצונך לבטל את סידורם.

בנוסף למודולים והפונקציות הללו, נשתמש גם במודול לעיצוב בשם pprint, אותו נייבא באמצעות from pprint import pprint. זה מאפשר לנו להשתמש בפונקציה pprint() אשר יכולה לשמש לעיצוב מבני נתונים כמו מילונים, ובכך מאפשרת לנו להציג את המידע בצורה ברורה.

כדי להתחיל, לך לסימון X המאור בתוך תחנת המעקב הקטנה והתייצב מול מסוף המחשב. התחנה מנטרת את לחץ המים ותנאי הקרקע של השטח הסמוך שמתפתח לצורך נטיעת גידולים. קיימת קבוע בשם reading, המכיל את נתוני הפייתון שנאספו על ידי התחנה.

צור משתנה בשם data ואחסן בו את הערך המוחזר מהפונקציה marshal.dumps(), כאשר reading הוא הארגומנט. כך: data = marshal.dumps(reading). השתמש במשתנה data עם הפונקציה display() שכבר נכתבה כדי להציג את נתוני המשתנה המסודרים.

צא מהתחנה ופנה לסימון X זהוב, השתמש בפונקציה open() כדי לפתוח את הדלת ולהיכנס למשרד. עבור לסימון X המאור מול המסוף, ובטל את הסידור של הנתונים שסידרת זה עתה. צור משתנה בשם output ואחסן בו את הערך המוחזר מהפונקציה marshal.loads() עם משתנה data כארגומנט. השתמש בפונקציה write() והוסף את output כארגומנט כדי לגשת לנתונים המסודרים שנאספו מהתחנה.

עבור לסימון X המאור על גבי השטיח הכחול במשרד, במסוף נוודא את הפרוטוקולים כדי לקבוע איזה סוג של סידור ישמש המודול pickle בעת עיבוד הנתונים. בפונקציה write() שכבר נכתבה, הגדר את הארגומנטים כ- pickle.DEFAULT_PROTOCOL ו- pickle.HIGHEST_PROTOCOL. הדבר יאמת מהו פרוטוקול הסידור הנוכחי ומהו הפרוטוקול העדכני ביותר הזמין כרגע.

המשך לסימון X הכהה על גבי השטיח הכחול, עכשיו כשאישרנו את הפרוטוקולים, נוכל לאמת את הנתונים המאוחסנים. הנתונים נאספו ואוחסנו במשך החודשים ואוחסנו בקבוע בשם samples. צור שלושה משתנים בשם: sereal_0, sereal_2 ו- sereal_5; נשתמש בהם לאימות שלושה מהפרוטוקולים הזמינים לסידור. פרוטוקול 0 הוא בפורמט ASCII קריא, אך לא יעיל במיוחד, פרוטוקול 2 הוא בפורמט בינארי יעיל יותר ופרוטוקול 5 הוא העדכני עם התכונות המורכבות ביותר.

נאחסן את הערך המוחזר מהפונקציה pickle.dumps() ונגדיר כארגומנטים את הקבוע samples ואת ה- protocol התואם למספר שבשם המשתנה. לדוגמה, עבור sereal_0 נגדיר את ה- protocol כ- 0, כך: sereal_0 = pickle.dumps(samples, protocol=0). השתמש ב- sereal_0, sereal_2 ו- sereal_5 עם הפונקציה display() שכבר נכתבה כדי לבדוק עד כמה שונה הסידור של כל פרוטוקול.

עבור לסימון X המאור על גבי השטיח האדום והתייצב מול המסוף, כתוב מחדש את המשתנה output ואחסן בו את הערך המוחזר מהפונקציה pickle.loads(), כאשר הארגומנט הוא sereal_5, כדי לבטל את הסידור של נתוני הדגם שנאספו עד כה. השתמש בפונקציה display() והוסף את הפונקציה pprint() עם המשתנה output כדי להציג את הנתונים. כך: await player.display(pprint(output)). רשום את הדירוגים עבור כל חודש המוצגים במסוף כדי שתוכל לתעד אותם מאוחר יותר.

עבור לסימון X הכהה על גבי השטיח האדום והתייצב מול השולחן, בפונקציה write() שכבר נכתבה, הוסף את הדירוגים שרשמת עבור כל חודש, כפי שהוצגו קודם במסוף. הוסף אותם כמחרוזות עם סימני "" בסדר הנכון כפי שמפורט בפונקציה, כדי להשלים את הרמה.

ספר קוד