קורס פיתוח מתקדם בפייתון
פרק
>
רמה
מודולי סריאליזציה
מודולי דחיסה
מטרה
קח הודעות והזמנות ודחוס אותן לארכוב והעברה.
ישנן מספר הוראות בנייה, משלוחים ומניפסטים שהוגשו וצריכים להיות מועברים או מאוחסנים. למרות שניתן לשלוח אותם על ידי שליחת כל הנתונים באופן ידני, דרך טובה לעשות זאת היא על ידי דחיסה ופריסה של הקבצים ולאחר מכן לאחסן או לשלוח אותם. לשם כך, ניתן להשתמש במודולי דחיסה כדי להקטין את גודל הקבצים ולהפוך את ניהול המידע לקל יותר. בניגוד לבעיות אחרות שלמדנו ופתרנו בהן באמצעות מודול יחיד, ישנם מספר מודולי דחיסה בהם ניתן להשתמש עם מבחר קטן של פונקציות. הם כדלהלן:
למהירות דחיסה גבוהה ודחיסה נמוכה, השתמשו במודול zlib, על ידי הוספת import zlib. למטרותינו נשתמש בפונקציה הבאה: zlib.compress(), המשתמשת בארגומנט אחד, שהוא המידע שברצונכם לדחוס. הארגומנט צריך להיות מוזן כבייטים במקום כמחרוזת.
למהירות דחיסה בינונית ודחיסה בינונית, השתמשו במודול bz2, על ידי הוספת import bz2. למטרותינו נשתמש בפונקציות הבאות:
bz2.compress(), משתמשת בארגומנט אחד, שהוא המידע שברצונכם לדחוס.bz2.decompress(), משתמשת בארגומנט אחד, שהוא המידע שברצונכם לדחוס. יש להזין אותו כבייטים במקום כמחרוזת.
יש להזין את הארגומנטים כבייטים במקום כמחרוזת.
למהירות דחיסה גבוהה אך עם מהירות פעולה איטית, השתמשו במודול lzma, על ידי הוספת import lzma. למטרותינו נשתמש במחלקות ובפונקציות הבאות:
lzma.LZMACompressor(): מחלקה המשמשת ליצירת אובייקטים לדחיסה, המאפשרת הפעלה של מדחס.compress(): משתמשת בארגומנט אחד, שהוא המידע שברצונכם לדחוס. יש להזין אותו כבייטים במקום כמחרוזת. הארגומנט צריך להיות מוזן כבייטים במקום כמחרוזת.
בנוסף למודולים אלו, נשתמש בפונקציה bytes() המאפשרת המרת מחרוזות לבייטים, תכונה שתועיל לדחיסה. הפונקציה מקבלת שני ארגומנטים, המחרוזת אותה תרצו להמיר והפורמט, שלמטרותינו הוא 'utf-8'.
קיימים שלושה קבועים המכילים נתונים שיש לדחוס, והם בעלי השמות red_message, blue_message ו-green_message. בתחילת העבודה, צעדו לסמן ה-X הזהוב מעל השטיח האדום, וצורו משתנה בשם red_bytes. קחו את הקבוע red_message והמרו את ההודעה לבייטים כדי שהנתונים יוכלו להיות דחוסים, באמצעות הפונקציה bytes() עם פורמט 'utf-8', כך: red_bytes = bytes(red_message, 'utf-8').
צרו משתנה בשם red_compression ואחסנו בו את הערך של zlib.compress(). השתמשו ב-red_bytes כארגומנט שידחוס את הנתונים, כך: red_compression = zlib.compress(red_bytes). לאחר שהנתונים נדחסו, השתמשו בפונקציה display() הכתובה מראש בעורך הקוד והוסיפו את המשתנים red_message ו-red_compression כארגומנטים, כדי לקרוא את ההודעה ולצפות בנתוני הדחיסה.
צעדו לסמן ה-X הבהיר מעל השטיח האדום ופנו אל השולחן, וצורו שני משתנים בשם: message_length ו-compression_length. במשתנים אלו נאגור את אורך התווים של הנתונים, הן לפני הדחיסה והן אחרי, באמצעות הפונקציה len(). לדוגמה, עבור message_length, קחו את האורך של red_message, כך: message_length = len(red_message). עשו את אותו הדבר עבור compression_length על ידי אחסון הערך המוחזר מ-len(red_compression).
לאחר ששני המשתנים מולאו, השתמשו בפונקציה write() הכתובה מראש והכניסו את message_length ו-compression_length כארגומנטים, כדי לאמת את גדלי הדחיסה. פעולה זו מדגימה את רמת הדחיסה של הקובץ לעומת מצבו המקורי שלא נדחס.
צעדו לסמן ה-X הכהה מעל השטיח הכחול ופנו אל המחשב. צרו משתנה בשם blue_bytes והמרו את blue_message לבייטים באמצעות הפונקציה bytes() באותה צורה שבה המרתם את red_message. קחו את הקבוע blue_message ודחסו אותו על ידי אחסון הערך המוחזר מ-bz2.compress() והוסיפו את blue_bytes כארגומנט, כך: blue_message = bz2.compress(blue_bytes).
צרו משתנה בשם blue_decompress ואחסנו בו את הערך המוחזר מ-bz2.decompress(), והוסיפו את blue_message כארגומנט, כדי לצפות בנתונים לאחר הפריסה. הוסיפו את המשתנים blue_message ו-blue_decompress לפונקציה display() הכתובה מראש, כדי לצפות בגרסאות הדחוסה והלא דחוסה של נתוני ההודעה.
צעידתכם הבאה היא לסמן ה-X הכהה מעל השטיח הירוק, וצורו אובייקט בשם compressor ומלאו אותו ב-lzma.LZMACompressor(). פעולה זו תיצור אובייקט דחיסה שישמש עם פונקציות lzma. צרו משתנה בשם green_bytes והמרו את green_message לפורמט בייטים באמצעות הפונקציה bytes(), באותה צורה שבה המרתם את red_message ואת blue_message.
צרו משתנה בשם green_compression ואחסנו בו את הערך המוחזר מ-compressor.compress(), כאשר מוסיפים את green_bytes כארגומנט. פעולה זו תאפשר לדחוס את נתוני ההודעה באמצעות אובייקט הדחיסה. בפונקציה display() הכתובה מראש, הוסיפו את המשתנים green_message ו-green_compression כארגומנטים, כדי לצפות בהודעה ובנתוני הדחיסה.
צעדו לסמן ה-X הבהיר מעל השטיח הירוק ופנו אל השולחן, וערכו את שני המשתנים בשם: message_length ו-compression_length. במשתנים אלו נאגור את אורך התווים של הנתונים, הן לפני הדחיסה והן אחרי, באמצעות הפונקציה len(). עבור message_length קחו את אורך green_message עם len(). עשו את אותו הדבר עבור compression_length על ידי אחסון הערך המוחזר מ-len(green_compression). לאחר ששני המשתנים מולאו, השתמשו בפונקציה write() הכתובה מראש והכניסו את message_length ו-compression_length כארגומנטים, כדי לאמת את גדלי הדחיסה ולסיים את השלב.