קורס פיתוח מתקדם בפייתון
פרק
>
רמה

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

מטרה

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

בהמשך לאורך השביל, אנו מוצאים מספר תחנות שמנטרות את חלוקת המים ואיכות הקרקע של השטח שמתפתח לקראת קציר עתידי. כדי לעבד את הנתונים, יעיל לסריאליזציה שלהם. בעוד ששימוש ב-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(): מבצע דסיריאליזציה של נתונים בינאריים לסוגי נתונים קריאים בפייתון, בעל יכולת עיבוד עצמים מורחבת בפייתון. מקבל ארגומנט אחד, שהוא הנתונים שברצונך לדסיריאליזציה.

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

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

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

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

ספר קוד