Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň
Serializační moduly
Moduly Marshal a Pickle
Cíl
Jděte na servisní stanici a ujistěte se, že jsou data správně uložena pomocí modulu JSON pro formátování souborů.
Pokračujeme cestou a nacházíme několik stanic monitorujících distribuci vody a kvalitu půdy na pozemku, který se připravuje pro budoucí sklizeň. Pro zpracování dat je efektivní data serializovat. Použití modulu Json může být účinným všeobecným řešením, ale existuje také několik metod serializace specifických pro Python, a to moduly Marshal a Pickle. Modul Marshal je určen pro rychlou serializaci/deserializaci převodem dat do binárního formátu, což je ideální pro jednodušší přenosy dat. Modul Pickle je pomalejší, ale je navržen pro zpracování složitějších datových struktur a je mnohem flexibilnější, ideální pro větší nebo prioritní datové struktury.
K použití modulů Marshal a Pickle importujte jejich funkce napsá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ženého pro rychlost v Pythonu. Přijímá jeden argument, kterým jsou data, která chcete serializovat, a je omezen na základní datové typy.marshal.loads(): Deserializuje binární data do čitelných datových typů v Pythonu, omezených ve svých možnostech, ale s rychlým provedením. Přijímá jeden argument, kterým jsou data, která chcete deserializovat.pickle.DEFAULT_PROTOCOL: Zjistí, jaká verze protokolu pro serializaci modulu Pickle je ve vaší verzi Pythonu nastavena jako výchozí. Protokoly ovlivňují, jak jsou data serializována.pickle.HIGHEST_PROTOCOL: Zjistí, jaká verze protokolu pro serializaci modulu Pickle je ve vaší verzi Pythonu nejvyšší. Protokoly ovlivňují, jak jsou data serializována.pickle.dumps(): Serializuje složité datové struktury Pythonu do binárního formátu podle použitého protokolu. Přijímá dva argumenty, data, která chcete serializovat, a verzi protokolu, kterou chcete při serializaci použít.pickle.loads(): Deserializuje binární data do čitelných datových typů Pythonu, což je velmi silné při zpracování Python objektů. Přijímá jeden argument, kterým jsou data, která chcete deserializovat.
Kromě těchto modulů a funkcí budeme také používat formátovací modul nazvaný pformat, který importujeme pomocí from pprint import pformat. To nám umožní použít funkci pformat(), kterou můžeme využít k formátování datových struktur, jako jsou slovníky, a tím přehledně zobrazit informace.
Na začátku se vydejte ke světlo X značce uvnitř malé monitorovací stanice a postavte se k počítačovému terminálu. Stanice monitoruje tlak vody a podmínky půdy v blízkém okolí, které se připravuje pro pěstování plodin. Existuje konstanta pojmenovaná reading, která obsahuje Python data sesbíraná stanicí.
Vytvořte proměnnou pojmenovanou data a uložte do ní hodnotu funkce marshal.dumps(), přičemž jako argument nastavte reading. Například: data = marshal.dumps(reading). Použijte proměnnou data s předem napsanou funkcí display(), abyste zobrazili serializovaná data proměnné.
Vyjděte ze stanice a vydejte se ke zlaté X značce, použijte funkci open() k otevření dveří a získání přístupu do kanceláře. Vydejte se ke světlo X značce před terminálem a deserializujte data, která jste právě serializovali. Vytvořte proměnnou pojmenovanou output a uložte do ní hodnotu funkce marshal.loads() s předchozí proměnnou data jako argumentem. Použijte funkci write() a předejte jí jako argument output, abyste získali serializovaná data, která jste sesbírali ze stanice monitorování.
Vydejte se ke světlo X značce přes modrý koberec v kanceláři, u terminálu ověříme protokoly, abychom zjistili, jaký typ serializace bude modul pickle používat při zpracování dat. V předem napsané funkci write() nastavte argumenty jako pickle.DEFAULT_PROTOCOL a pickle.HIGHEST_PROTOCOL. Tím ověříte, jaký je aktuální serializační protokol a jaký je nejnovější dostupný serializační protokol v současné době.
Přejděte k tmavé X značce přes modrý koberec, nyní, když jsme potvrdili protokoly, můžeme ověřit uložená data. Data byla sesbírána a uložena během měsíců a uložena v konstantě pojmenované samples. Vytvořte tři proměnné pojmenované: sereal_0, sereal_2 a sereal_5, které použijeme pro ověření tří dostupných protokolů pro serializaci. Protokol 0 je čitelný jako ASCII, ale není příliš efektivní, protokol 2 je efektivnější binární formát a protokol 5 je nejnovější s nejrozsáhlejšími přidanými funkcemi.
Uložíme hodnotu funkce pickle.dumps() a jako argumenty nastavíme konstantu samples a protocol odpovídající číslu v názvu proměnné. Například pro sereal_0 nastavíme protocol jako 0, takto: sereal_0 = pickle.dumps(samples, protocol=0). Použijte proměnné sereal_0, sereal_2 a sereal_5 s předem napsanou funkcí display(), abyste ověřili, jak se serializace liší pro každý protokol.
Vydejte se ke světlo X značce přes červený koberec a postavte se k terminálu, přepište proměnnou output a uložte do ní hodnotu funkce pickle.loads(), přičemž jako argument nastavte sereal_5 pro deserializaci sesbíraných vzorkových dat. Použijte funkci display() a předejte jí funkci pformat() s proměnnou output pro zobrazení dat. Takto: await player.display(pformat(output)). Poznamenejte si hodnocení pro každý měsíc, která byla zobrazena na terminálu, abyste je později mohli zaznamenat.
Vydejte se ke tmavé X značce přes červený koberec a postavte se ke stolu, v předem napsané funkci write() přidejte hodnocení, která jste si poznamenali pro každý měsíc, jež byla dříve zobrazena na terminálu. Přidejte je jako řetězce uzavřené v uvozovkách "" ve správném pořadí, jak je uvedeno ve funkci, abyste dokončili úroveň.