Coding for KidsCoding for Kids
Kreativní ÚrovněVýzvyPrůvodce pro Učitele
Hlasovat pro funkce
Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň

Moduly serializace
Moduly Marshal a Pickle

Úkol

Jděte na servisní stanici a ujistěte se, že data jsou správně uložena pomocí modulu JSON pro formátování souborů.

Když pokračujeme po cestě, najdeme několik stanic, které monitorují distribuci vody a kvalitu půdy na pozemku, jenž se připravuje na budoucí sklizeň. Pro zpracování dat je efektivní data serializovat. Ačkoli použití JSON může být účinným obecným řešením, existuje také několik specifických metod serializace pro Python, konkrétně moduly Marshal a Pickle. Modul Marshal je navrž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 určen pro zpracování složitějších datových struktur a je mnohem flexibilnější, což ho činí ideálním pro větší nebo prioritní datové struktury.

Pro 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é pro rychlost v rámci Pythonu. Přijímá jeden argument, jímž jsou data, která chcete serializovat, a je omezeno na základní datové typy.
  • marshal.loads(): Deserializuje binární data do čitelných datových typů v Pythonu, omezené ve svých schopnostech, ale s rychlým provedením. Přijímá jeden argument, data, která se mají deserializovat.
  • pickle.DEFAULT_PROTOCOL: Určuje, jaká verze protokolu pro serializaci Pickle je výchozí ve vaší verzi Pythonu. Protokoly ovlivňují, jak jsou data serializována.
  • pickle.HIGHEST_PROTOCOL: Určuje, jaká verze protokolu pro serializaci Pickle je nejvyšší dostupná ve vaší verzi Pythonu. 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ů v Pythonu, což je účinné při práci s Python objekty. Přijímá jeden argument, data, která chcete deserializovat.

Kromě těchto modulů a funkcí budeme také používat formátovací modul nazvaný pprint, který importujeme pomocí from pprint import pprint. To nám umožňuje používat funkci pprint(), kterou lze formátovat datové struktury, jako jsou slovníky, aby bylo možné informace zobrazovat přehledně.

Na začátek jděte ke světelné značce X uvnitř malé monitorovací stanice a postavte se ke počítačovému terminálu. Stanice sleduje tlak vody a stav půdy na blízkém území, které se připravuje k výsadbě plodin. Existuje konstanta reading, která obsahuje Python data shromážděná stanicí.

Vytvořte proměnnou data a uložte do ní hodnotu funkce marshal.dumps(), přičemž jako argument použijete reading. Takto: data = marshal.dumps(reading). Použijte proměnnou data s předdefinovanou funkcí display() pro zobrazení serializovaných dat v proměnné.

Vyjděte ze stanice a zamiřte ke zlaté značce X, použijte funkci open() k otevření dveří a získání přístupu do kanceláře. Pak jděte ke světelné značce X před terminálem a deserializujte data, která jste právě serializovali. Vytvořte proměnnou 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í output jako argument pro přístup ke serializovaným datům shromážděným z monitorovací stanice.

Přejděte ke světelné značce X na modrém koberci 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ředdefinované funkci write() nastavte argumenty na pickle.DEFAULT_PROTOCOL a pickle.HIGHEST_PROTOCOL. Tím se ověří aktuální serializační protokol i nejnovější dostupný protokol.

Pokračujte k tmavé značce X na modrém koberci, nyní když jsme potvrdili protokoly, můžeme ověřit uložená data. Data byla sbírána a uložena během několika měsíců a jsou uložena v konstantě samples. Vytvořte tři proměnné: sereal_0, sereal_2 a sereal_5, které použijeme k ověření tří dostupných serializačních protokolů. Protokol 0 je čitelný v ASCII, ale není příliš efektivní, protokol 2 je efektivnější binární formát a protokol 5 je nejnovější s nejpokročilejšími funkcemi.

Uložíme hodnotu z funkce pickle.dumps() a jako argumenty zadáme konstantu samples a protocol odpovídající číslu v názvu proměnné. Například u sereal_0 nastavíme protocol na 0, takto: sereal_0 = pickle.dumps(samples, protocol=0). Použijte proměnné sereal_0, sereal_2 a sereal_5 s předdefinovanou funkcí display() k ověření rozdílů v serializaci pro každý protokol.

Přejděte ke světelné značce X 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(), kde jako argument nastavíte sereal_5, abyste deserializovali dosud shromážděná ukázková data. Použijte funkci display() a přidejte funkci pprint() spolu s proměnnou output pro zobrazení dat. Takto: await player.display(pprint(output)). Poznamenejte si hodnocení za každý měsíc zobrazená v terminálu, abyste je později mohli zaznamenat.

Přejděte k tmavé značce X na červeném koberci a postavte se ke stolu. V předdefinované funkci write() přidejte hodnocení, která jste si poznamenali za každý měsíc, jež byla dříve zobrazena v 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ň.

Kniha Kódu