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

מודולי סריאליזציה
מודולי Marshal ו-Pickle

מטרה

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

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

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

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

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

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

ספר קוד