Haladó Python Fejlesztői Tanfolyam
Fejezet
>
Szint
Szerializációs modulok
Marshal és Pickle modulok
Célkitűzés
Menj a szervizállomásra, és győződj meg róla, hogy az adatok megfelelően tárolódnak a JSON modul használatával a fájlok formázásához.
Amint tovább haladunk az útvonalon, néhány olyan állomásra bukkanunk, amelyek a vízelosztást és a talaj minőségét figyelik azoknál a területeknél, amelyeket a jövőbeli betakarításra fejlesztenek. Az adatok feldolgozásához hatékony az adatok sorosítása. Bár a JSON á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 a pickle modulok. A marshal modul gyors sorosítást/deszerializálást tesz lehetővé az adatok binárissá alakításával, ami egyszerűbb adatátvitelhez ideális. A pickle modul lassabb, de komplexebb adatszerkezetek feldolgozására tervezett és sokkal rugalmasabb, így nagyobb vagy prioritású adatszerkezetekhez ideális.
A marshal és a pickle modulok használatához importáld a funkciókat a következő sorok beírásával: import marshal és import pickle. A mi esetünkben a következő függvényeket fogjuk használni:
marshal.dumps(): Adatok bináris formátumba történő sorosítása (serialization), a Pythonon belüli gyors végrehajtásra tervezve. Egy argumentuma van, ez az a adat, amit sorosítani szeretnél; csak alapvető adattípusokra korlátozódik.marshal.loads(): Bináris adatok deszerializálása Python által olvasható adattípusokká, korlátozott képességekkel, de gyors végrehajtással. Egy argumentuma van, ez az a bináris adat, amit deszerializálni szeretnél.pickle.DEFAULT_PROTOCOL: Lekérdezi, hogy a Pickle sorosításhoz mely protokollverzió az alapértelmezett a Python verziódban. A protokollok befolyásolják az adatok sorosításának módját.pickle.HIGHEST_PROTOCOL: Lekérdezi, hogy a Pickle sorosításhoz mely protokollverzió a legmagasabb elérhető a Python verziódban. A protokollok befolyásolják 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 argumentuma van: az adat, amit sorosítani szeretnél, és a használni kívánt protokollverzió.pickle.loads(): Bináris adatokat deszerializál Python által olvasható adattípusokká, nagyobb hatókörrel Python-objektumok esetén. Egy argumentuma van, ez az a bináris adat, amit deszerializálni szeretnél.
A fenti modulokon és függvényeken felül egy formázó modult is használni fogunk pformat néven, amelyet az alábbi módon importálunk: from pprint import pformat. Ez lehetővé teszi a pformat() függvény használatát, amellyel például szótárak szerkezetét formázhatjuk meg, így az információt világosan tudjuk megjeleníteni.
A kezdéshez sétálj a kis megfigyelőállomásban lévő világos X jelzéshez, és fordulj a számítógép terminál felé. Az állomás a víznyomást és a közeli terület talajának állapotát figyeli, amelyet a növények ültetésére fejlesztenek. Van egy reading nevű konstans, amely a terminál által gyűjtött Python-adatokat tartalmazza.
Hozz létre egy data nevű változót, és rendeld hozzá a marshal.dumps() függvény visszatérési értékét úgy, hogy argumentumként a reading konstans szerepel. Így: data = marshal.dumps(reading). Használd a data változót az előre megírt display() függvénnyel a sorosított adatok megtekintéséhez.
Sétálj ki az állomásról, és menj az arany X jelzéshez; használd az open() függvényt az ajtó kinyitásához, hogy belépj az irodába. Ezután sétálj a terminál előtti világos X jelzéshez, és deszerializáld a korábban sorosított adatokat. Hozz létre egy output nevű változót, és rendeld hozzá a marshal.loads() visszatérési értékét úgy, hogy argumentumként a data változót adod meg. Használd a write() függvényt, és add meg argumentumként az output-ot, hogy hozzáférj a megfigyelőállomásról gyűjtött adatokhoz.
Sétálj a kék szőnyeg feletti világos X jelzéshez az irodában; a terminálnál ellenőrizni fogjuk a protokollokat, hogy meghatározzuk, melyiket használja a pickle modul az adatok feldolgozásakor. Az előre megírt write() függvényben állítsd be argumentumként a pickle.DEFAULT_PROTOCOL-t és a pickle.HIGHEST_PROTOCOL-t. Ez megmutatja az aktuális sorosítási protokollt, valamint a legújabb elérhető protokollt.
Haladj tovább a kék szőnyeg feletti sötét X jelzéshez; most, hogy megerősítettük a protokollokat, ellenőrizhetjük a tárolt adatokat. Az adatok hónapokon át gyűltek össze, és egy samples nevű konstansban tárolódnak. Hozz létre három változót sereal_0, sereal_2 és sereal_5 néven; ezek segítségével fogjuk ellenőrizni a sorosításhoz elérhető három protokollt. A 0-ás protokoll olvasható ASCII, nem túl hatékony; a 2-es protokoll hatékonyabb bináris formátum; az 5-ös pedig a legújabb, a legtöbb extra funkcióval.
A pickle.dumps() visszatérési értékét fogjuk eltárolni, és argumentumként megadjuk a samples konstansot, valamint a változó nevében szereplő számnak megfelelő protocol értéket. Például az sereal_0 esetén a protocol értéke 0, így: sereal_0 = pickle.dumps(samples, protocol=0). Használd az sereal_0, sereal_2 és sereal_5 változókat az előre megírt display() függvénnyel, hogy összehasonlíthasd a sorosítás különböző protokollok szerinti eredményeit.
Sétálj a vörös szőnyeg feletti világos X jelzéshez, és állj a terminál elé; írd felül az output változót, és rendeld hozzá a pickle.loads() visszatérési értékét úgy, hogy argumentumként az sereal_5 szerepeljen, ezzel deszerializálod az eddig gyűjtött mintákat. Használd a display() függvényt, és ágyazd be a pformat() függvényt az output változóval az adatok megjelenítéséhez, így: await player.display(pformat(output)). Jegyezd fel a terminálban megjelenő havi értékeléseket, hogy később felrajzolhasd őket.
Sétálj a vörös szőnyeg feletti sötét X jelzéshez, és állj az íróasztalhoz; az előre megírt write() függvényben add hozzá a terminálban korábban megjelenített havi értékeléseket. Add meg őket stringként idézőjelek ("") között, a helyes sorrendben az előírás szerint a szint teljesítéséhez.