Fejlett Python fejlesztési tanfolyam
Fejezet
>
Szint
Szerializációs modulok
Marshal és Pickle modulok
Célkitűzés
Menj a szolgáltató állomáshoz, és győződj meg róla, hogy az adatokat megfelelően tárolják a JSON modul segítségével a fájlok formázásához.
Folytatva az ösvényt, néhány állomást találunk, amelyek figyelik a vízelosztást és a talaj minőségét azon területen, amelyet a jövőbeni terméshez fejlesztenek. Az adatok feldolgozásához hatékony az adatok sorosítása. Bár a JSON használata általános megoldásként hatékony lehet, léteznek néhány Python-specifikus sorosítási módszer is, nevezetesen a Marshal és Pickle modulok. A Marshal modul az adatok gyors sorosítására/deszerializálására lett tervezve, azzal, hogy az adatokat bináris formátumba alakítja, ami ideális egyszerűbb adatátvitelekhez. A Pickle modul lassabb, de összetettebb adatszerkezetek feldolgozására készült, és sokkal rugalmasabb, így nagyobb vagy elsőbbségi adatszerkezetek esetén ideális.
A Marshal és a Pickle modulok használatához importáld a függvényeiket az alábbi módon: import marshal és import pickle. Számunkra a következő függvények lesznek fontosak:
marshal.dumps(): Az adatokat bináris formátumba sorosítja, a Pythonon belüli gyorsaságra optimalizálva. Egy argumentumot vár, ami az a adat, amit sorosítani szeretnél, és csak az alapvető adattípusokra korlátozódik.marshal.loads(): A bináris adatokat Python által olvasható adattípusokká deszerializálja, bár korlátozott képességekkel, de gyorsan végrehajtódik. Egy argumentumot vár, ami az a adat, amit deszerializálni szeretnél.pickle.DEFAULT_PROTOCOL: Megnézi, hogy a Python verziódban melyik Pickle sorosítási protokoll verzió az alapértelmezett. A protokollok befolyásolják, hogyan történik az adatok sorosítása.pickle.HIGHEST_PROTOCOL: Megnézi, hogy a Python verziódban melyik Pickle sorosítási protokoll verzió a legmagasabb elérhető. A protokollok határozzák meg az adatok sorosításának módját.pickle.dumps(): Összetett Python adatszerkezeteket sorosít bináris formátumba a használt protokoll szerint. Két argumentumot vár, a sorosítani kívánt adatot és a sorosítás során alkalmazandó protokoll verzióját.pickle.loads(): A bináris adatokat Python által olvasható adattípusokká deszerializálja, ami kiterjedtebb a Python objektumokra. Egy argumentumot vár, az a adat, amit deszerializálni szeretnél.
Ezen modulokon és függvényeken kívül egy formázó modult is fogunk használni, melynek neve pformat, és amit az alábbi módon importálunk: from pprint import pformat. Ez lehetővé teszi számunkra a pformat() függvény használatát, mellyel olyan adatszerkezeteket, mint például a szótárak, formázhatunk, így az információk egyértelműen megjeleníthetők.
Kezdésként menj a kis megfigyelő állomáson belüli világító X jelhez, és fordulj a számítógépes terminál felé. Az állomás a közeli, növénytermesztésre fejlesztett terület víznyomását és talajviszonyait figyeli. Létezik egy reading nevű konstans, amely az á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. Ily módon: data = marshal.dumps(reading). Használd a data változót a már előre megírt display() függvénnyel a sorosított változó adat megjelenítéséhez.
Menj ki az állomáshoz, majd haladj a gold X jelzés felé; használd az open() függvényt az ajtó kinyitásához, hogy hozzáférj az irodához. Menj a terminál előtt található világító X jelhez, és deszerializáld az előzőleg sorosított adatokat. Hozz létre egy output nevű változót, és tárold benne a marshal.loads() függvény értékét úgy, hogy a korábbi data változót adod át argumentumként. Használd a write() függvényt úgy, hogy az output változót adod át argumentumként, ezzel hozzáférve a megfigyelő állomásról gyűjtött sorosított adathoz.
Menj az irodában a kék szőnyegen lévő világító X jelzés felé; a terminálon ellenőrizni fogjuk a protokollokat, hogy meghatározzuk, milyen típusú sorosítást fog a pickle modul használni az adatok feldolgozásához. Az előre megírt write() függvényben állítsd be a paramétereket úgy, hogy pickle.DEFAULT_PROTOCOL és pickle.HIGHEST_PROTOCOL értékeket adsz meg. Ez ellenőrzi az aktuális sorosítási protokollt, valamint a jelenleg elérhető legújabb sorosítási protokollt.
Haladj tovább a kék szőnyegen lévő sötét X jelzés felé, mert most, hogy megerősítettük a protokollokat, ellenőriznünk kell a tárolt adatokat. Az adatok hónapokon át gyűltek össze és egy samples nevű konstansban kerültek tárolásra. Hozz létre három változót: sereal_0, sereal_2 és sereal_5, melyeket a sorosításra elérhető három protokoll ellenőrzéséhez fogsz használni. A 0 protokoll olvasható ASCII formátumot eredményez, bár nem túl hatékony, a 2 protokoll egy hatékonyabb bináris formátum, míg az 5 protokoll a legújabb, amely a legösszetettebb funkciókat tartalmazza.
Tárold a pickle.dumps() függvény által visszaadott értéket úgy, hogy a samples konstans és a változó nevében szereplő számnak megfelelő protocol argumentumot adod át. Például a sereal_0 esetében állítsd a protocol értékét 0-ra, mint itt: 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őrizd, mennyire különbözik a sorosítás minden egyes protokoll esetében.
Menj a piros szőnyegen lévő világító X jelzés felé, és fordulj a terminál felé. Írd felül az output változót úgy, hogy a pickle.loads() függvény értékét tárolod benne, a sereal_5 változót argumentumként átadva, hogy deszerializáld az eddig összegyűjtött mintaadatokat. Használd a display() függvényt, és add át a pformat() függvényt az output változóval, hogy megjeleníthesd az adatokat. Ily módon: await player.display(pformat(output)). Jegyezd fel a terminálon megjelenített havi értékeléseket, hogy később le tudd jegyzetelni őket.
Menj a piros szőnyegen lévő sötét X jelzés felé, és fordulj az asztal felé. Az előre megírt write() függvényben add hozzá az egyes hónapokra vonatkozó értékeléseket, amelyeket korábban a terminálon láttál. Add meg őket idézőjelek között, a függvényben meghatározott sorrendben, hogy teljesítsd a szintet.