Fejlett Python fejlesztési tanfolyam
Fejezet
>
Szint
Szerializációs modulok
Marshal és Pickle modulok
Célkitűzés
Menj el a szolgáltatási állomásra, és győződj meg arról, hogy az adatokat megfelelően tárolták, a JSON modul használatával a fájlok formázásához.
Ahogy folytatjuk az ösvényt, néhány állomást találunk, amelyek a vízelosztást és a talaj minőségét ellenőrzik azon területen, amelyet a jövőbeni betakarításhoz fejlesztenek. Az adatok feldolgozásához hatékony az adatok szerializálása. Bár a Json használata általános megoldásként hatékony lehet, néhány Python-specifikus szerializációs módszer is létezik, ilyenek például a Marshal és a Pickle modulok. A Marshal modul a gyors szerializálás/deszerializálás céljából készült, mivel az adatokat bináris formába alakítja, ami ideálissá teszi egyszerűbb adatátvitelekhez. A Pickle modul lassabb, de összetettebb adatszerkezetek feldolgozására készült és sokkal rugalmasabb, így nagyobb vagy prioritást élvező adatszerkezetekhez ideális.
A Marshal és a Pickle modulok használatához importáld a függvényeiket a következőképpen: import marshal és import pickle. Szándékaink szerint a következő függvényeket fogjuk használni:
marshal.dumps(): Adatokat szerializál bináris formátumba, a Pythonon belüli sebességre tervezve. Egyetlen argumentumot vár, ami a szerializálni kívánt adat, és csak alapvető adattípusokat képes kezelni.marshal.loads(): Bináris adatokat deszerializál Python számára olvasható adattípusokká, képességeiben korlátozott, de gyorsan végrehajtódik. Egyetlen argumentumot vár, ami a deszerializálni kívánt adat.pickle.DEFAULT_PROTOCOL: Ellenőrzi, hogy a Python verziódban mely Pickle szerializációs protokoll verzió az alapértelmezett. A protokollok befolyásolják, hogy az adatok miként kerülnek szerializálásra.pickle.HIGHEST_PROTOCOL: Ellenőrzi, hogy a Python verziódban melyik a legmagasabb elérhető Pickle szerializációs protokoll. A protokollok befolyásolják, hogy az adatok miként kerülnek szerializálásra.pickle.dumps(): Összetett Python adatszerkezeteket szerializál bináris formátumba az éppen használt protokoll szerint. Két argumentumot vár: a szerializálni kívánt adatot, és a szerializálás során használandó protokoll verziót.pickle.loads(): Bináris adatokat deszerializál Python számára olvasható adattípusokká, kiterjedt képességekkel Python objektumok esetén. Egyetlen argumentumot vár, ami a deszerializálni kívánt adat.
Ezen modulokon és függvényeken felül egy formázó modult is használni fogunk, amelynek neve pprint, amelyet a from pprint import pprint paranccsal importálunk. Ez lehetővé teszi számunkra a pprint() függvény használatát, amellyel olyan adatszerkezetek, például szótárak formázhatók, így világosan megjeleníthetjük az információkat.
Kezdésként menj a kis megfigyelő állomáson belül a világító X jelhez, majd fordulj a számítógépes terminál felé. Az állomás figyeli a környező területen, ahol növénytermesztésre készülnek, a víznyomást és a talajviszonyokat. Létezik egy reading nevű állandó, amely a megfigyelő állomás által gyűjtött Python adatokat tartalmazza.
Hozz létre egy data nevű változót, és tárold benne a marshal.dumps() függvény értékét, úgy, hogy a reading változót adod át argumentumként. Így: data = marshal.dumps(reading). Használd a data változót a előre megírt display() függvénnyel, hogy megtekinthesd a szerializált változó adatot.
Kilépve az állomásból, menj a gold X jelhez, használd az open() függvényt az ajtó kinyitásához, így beléphetsz az irodába. Menj a terminál előtti világító X jelhez, és deszerializáld az előzőleg szerializált adatokat. Hozz létre egy output nevű változót, és tárold benne a marshal.loads() függvény értékét, ahol az előző data változót adod át argumentumként. Használd a write() függvényt, és add át az output változót, hogy hozzáférj a megfigyelő állomásról gyűjtött szerializált adatokhoz.
Menj az irodában a kék szőnyegen lévő világító X jelhez. A terminálon ellenőrizni fogjuk a protokollokat, hogy meghatározzuk, milyen típusú szerializációt fog a pickle modul használni az adatok feldolgozásakor. Az előre megírt write() függvényben add meg az argumentumokat pickle.DEFAULT_PROTOCOL és pickle.HIGHEST_PROTOCOL értékekkel. Ez ellenőrzi, hogy mi az aktuális szerializációs protokoll, illetve melyik a legfrissebb elérhető protokoll.
Haladj tovább a kék szőnyegen lévő sötét X jelhez; miután megerősítettük a protokollokat, ellenőrizhetjük a tárolt adatokat. Az adatok hónapok során gyűltek össze, és egy samples nevű állandóban lettek tárolva. Hozz létre három változót: sereal_0, sereal_2 és sereal_5, amelyeket arra használunk, hogy ellenőrizzük a szerializációra elérhető három protokollt. A 0 protokoll olvasható ASCII formátumú, nem túl hatékony, a 2 protokoll hatékonyabb bináris formátum, míg az 5 protokoll a legújabb, a legtöbb összetett funkcióval bővített.
Tárold el a pickle.dumps() értékét, úgy, hogy argumentumként a samples állandót és az adott változó nevében szereplő számhoz tartozó protocol értéket adod meg. Például a sereal_0 esetében a protocol értéke 0 lesz, így: sereal_0 = pickle.dumps(samples, protocol=0). Használd a sereal_0, sereal_2 és sereal_5 változókat az előre megírt display() függvénnyel, hogy ellenőrizhesd, mennyire eltér a szerializáció minden protokoll esetén.
Menj a piros szőnyegen lévő világító X jelhez, és fordulj a terminál felé. Írd felül az output változót úgy, hogy benne tárold a pickle.loads() függvény értékét, melynek argumentumaként a sereal_5 változót adod meg, ezzel deszerializálva az eddig összegyűjtött mintaadatokat. Használd a display() függvényt, és add át benne a pprint() függvényt az output változóval, hogy megtekinthesd az adatokat. Így: await player.display(pprint(output)). Jegyezd fel a terminálon megjelenő havi értékeléseket, hogy később le tudd rajzolni őket.
Menj a piros szőnyegen lévő sötét X jelhez, és fordulj az asztal felé. Az előre megírt write() függvényben add hozzá az általad korábban feljegyzett havi értékeléseket, melyek a terminálon voltak megjelenítve. Add őket szövegként, idézőjelek között (""), a függvényben meghatározott helyes sorrendben, hogy ezzel befejezd a szintet.