Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň
Serializační moduly
Moduly Marshal a Pickle
Cíl
Přejděte na servisní stanici a ujistěte se, že jsou data správně uložena pomocí modulu JSON pro formátování souborů.
Pokračováním po cestě narazíme na několik stanic, které sledují distribuci vody a kvalitu půdy na pozemcích, jež jsou rozvíjeny pro budoucí sklizeň. Pro zpracování dat je efektivní provést jejich serializaci. Použití JSONu může být efektivním obecně použitelným řešením, ale existují i některé pro Python specifické metody serializace, jimiž jsou moduly Marshal a Pickle. Modul Marshal je navržen pro rychlou serializaci/deserializaci převodem dat do binárního formátu, ideální pro jednodušší přenosy dat. Modul Pickle je pomalejší, ale je navržen k zpracování složitějších datových struktur a je mnohem flexibilnější, ideální pro rozsáhlejší či prioritní datové struktury.
Pro použití modulů Marshal a Pickle importujte jejich funkce zadáním: import marshal a import pickle.
Pro naše účely budeme používat následující funkce:
marshal.dumps(): Serializuje data do binárního formátu, navrženo pro rychlost v rámci Pythonu. Bere jeden argument, kterým jsou data, která chcete serializovat, a je omezené na základní datové typy.marshal.loads(): Deserializuje binární data do formy čitelné v Pythonu, s omezenými možnostmi, ale rychlým provedením. Bere jeden argument, a to data k deserializaci.pickle.DEFAULT_PROTOCOL: Zobrazuje, jaká verze protokolu pro serializaci Pickle je ve vaší verzi Pythonu výchozí. Protokoly ovlivňují způsob serializace dat.pickle.HIGHEST_PROTOCOL: Zobrazuje, jaká verze protokolu pro serializaci Pickle je ve vaší verzi Pythonu nejvyšší. Protokoly ovlivňují způsob serializace dat.pickle.dumps(): Serializuje složité datové struktury v Pythonu do binárního formátu podle použitého protokolu. Bere dva argumenty, data, která chcete serializovat, a verzi protokolu, kterou chcete při serializaci použít.pickle.loads(): Deserializuje binární data do formy čitelné v Pythonu, má široké možnosti pro objekty Pythonu. Bere jeden argument, a to data, která chcete deserializovat.
Kromě těchto modulů a funkcí budeme také používat modul pro formátování nazvaný pformat, který importujeme pomocí from pprint import pformat. To nám umožní používat funkci pformat(), kterou lze využít k formátování datových struktur, například slovníků, a jasnému zobrazení informací.
Pro začátek jděte k světlému křížku uvnitř malé monitorovací stanice a postavte se před počítačový terminál. Stanice sleduje tlak vody a podmínky půdy v blízkém terénu, který je rozvíjen pro pěstování plodin.
Existuje konstanta nazvaná reading, která obsahuje data v Pythonu shromážděná stanicí.
Vytvořte proměnnou nazvanou data a uložte do ní hodnotu funkce marshal.dumps(), přičemž jako argument nastavíte reading. Například: data = marshal.dumps(reading). Pomocí předdefinované funkce display() poté zobrazte sérializovaná data v proměnné data.
Vyjděte ze stanice a jděte ke zlatému křížku, použijte funkci open() k otevření dveří a vstupu do kanceláře. Jděte k světlému křížku před terminálem a deserializujte data, která jste právě serializovali. Vytvořte proměnnou nazvanou output a uložte do ní hodnotu funkce marshal.loads(), přičemž argumentem bude předchozí proměnná data. Pomocí funkce write() poté zadejte output jako argument a zobrazte tak data shromážděná ze sledovací stanice.
Jděte k světlému křížku na modrém koberci v kanceláři, u terminálu budeme ověřovat protokoly, abychom zjistili, jaký typ serializace bude modul pickle používat při zpracování dat. V předdefinované funkci write() nastavte argumenty na pickle.DEFAULT_PROTOCOL a pickle.HIGHEST_PROTOCOL. Tím ověříte, jaký je aktuální protokol serializace a jaký je nejnovější dostupný protokol.
Přesuňte se k tmavému křížku na modrém koberci. Nyní, když jsme potvrdili protokoly, můžeme ověřit uložená data. Data byla v průběhu měsíců shromážděna a uložena v konstantě samples. Vytvořte tři proměnné s názvy sereal_0, sereal_2 a sereal_5; použijeme je k ověření tří dostupných protokolů serializace. Protokol 0 je čitelný ASCII, není příliš efektivní, protokol 2 je efektivnější binární formát a protokol 5 je nejnovější s nejvíce přidanými pokročilými vlastnostmi.
Uložíme hodnotu funkce pickle.dumps() a jako argumenty nastavíme konstantu samples a protokol odpovídající číslu ve jménu proměnné. Například pro sereal_0 nastavíme protokol na 0, takto: sereal_0 = pickle.dumps(samples, protocol=0). Pomocí předdefinované funkce display() potom použijte sereal_0, sereal_2 a sereal_5 k ověření, jak se pro každý protokol serializace liší.
Jděte k světlému křížku na červeném koberci a postavte se k terminálu, přepište proměnnou output a uložte do ní hodnotu funkce pickle.loads() s argumentem sereal_5, abyste deserializovali dosud shromážděná vzorková data. Použijte funkci display() a přidejte funkci pformat() s proměnnou output, abyste data zobrazili. Například: await player.display(pformat(output)). Poznamenejte si hodnocení pro každý měsíc, která se zobrazí v terminálu, abyste je později mohli zanést do grafu.
Jděte k tmavému křížku na červeném koberci a postavte se k psacímu stolu. V předdefinované funkci write() přidejte hodnocení, která jste si pro každý měsíc poznamenali a která se dříve zobrazila v terminálu. Přidejte je jako řetězce v uvozovkách "" ve správném pořadí, jak je uvedeno ve funkci, abyste dokončili úroveň.