Geavanceerde Python-ontwikkelingscursus
Hoofdstuk
>
Niveau
Serialisatiemodules
Marshal- en Pickle-modules
Doel
Ga naar het servicestation en zorg ervoor dat de gegevens correct worden opgeslagen door de JSON-module te gebruiken om bestanden te formatteren.
Als we het pad volgen komen we een aantal stations tegen die de waterdistributie en de bodemkwaliteit monitoren voor het land dat wordt ontwikkeld voor een toekomstige oogst. Om de gegevens te verwerken is het efficiënt om ze te serialiseren. Hoewel het gebruik van JSON een algemene oplossing kan bieden, zijn er ook een paar Python-specifieke serialisatiemethoden, namelijk de Marshal- en Pickle-modules. De Marshal-module is ontworpen voor snelle serialisatie/deserialisatie door de data naar binair om te zetten, ideaal voor eenvoudigere gegevensoverdracht. De Pickle-module is trager maar is ontworpen om meer complexe datastructuren te verwerken en is veel flexibeler, ideaal voor grotere of prioritaire datastructuren.
Om de Marshal- en Pickle-modules te gebruiken, importeer je hun functies door te schrijven: import marshal en import pickle. Voor onze doeleinden gebruiken we de volgende functies:
marshal.dumps(): Serialiseert gegevens naar een binaire indeling, ontworpen voor snelheid binnen Python. Neemt één argument, namelijk de gegevens die je wilt serialiseren, en is beperkt tot basistypen.marshal.loads(): Deserialiseert binaire gegevens naar voor Python leesbare datatypes, beperkt in mogelijkheden maar met snelle uitvoering. Neemt één argument, namelijk de gegevens die je wilt deserialiseren.pickle.DEFAULT_PROTOCOL: Controleert welke protocolversie voor Pickle-serialisatie standaard is in jouw Python-versie. De protocollen beïnvloeden de manier waarop de gegevens worden geserialiseerd.pickle.HIGHEST_PROTOCOL: Controleert welke protocolversie voor Pickle-serialisatie de hoogste is in jouw Python-versie. De protocollen beïnvloeden de manier waarop de gegevens worden geserialiseerd.pickle.dumps(): Serialiseert complexe Python-datastructuren in binaire indeling volgens het gebruikte protocol. Neemt twee argumenten: de gegevens die je wilt serialiseren en de protocolversie die je wilt gebruiken bij het serialiseren.pickle.loads(): Deserialiseert binaire gegevens naar voor Python leesbare datatypes, krachtig in reikwijdte voor Python-objecten. Neemt één argument, namelijk de gegevens die je wilt deserialiseren.
Naast deze modules en functies zullen we ook een formatteringsmodule genaamd pformat gebruiken, die we importeren met from pprint import pformat. Hiermee kunnen we de functie pformat() gebruiken, waarmee we datastructuren zoals dictionaries kunnen formatteren zodat we de informatie duidelijk weergeven.
Om te beginnen, loop naar het lichte X-teken in het kleine monitorstation en ga voor de computerterminal staan. Het station monitort de waterdruk en de bodemgesteldheid van het nabijgelegen terrein dat wordt ontwikkeld voor de teelt van gewassen. Er is een constante genaamd reading, deze bevat de door het station verzamelde Python-gegevens.
Maak een variabele genaamd data en sla de waarde van de functie marshal.dumps() op met reading als argument. Zoals dit: data = marshal.dumps(reading). Gebruik de variabele data met de voorgeprogrammeerde functie display() om de geserialiseerde variabelegegevens te bekijken.
Loop het station uit en ga naar het gouden X-teken, gebruik de functie open() om de deur te openen en toegang te krijgen tot het kantoor. Loop naar het lichte X-teken voor de terminal en deserialiseer de data die je zojuist hebt geserialiseerd. Maak een variabele genaamd output en sla de waarde van marshal.loads() op met de vorige variabele data als argument. Gebruik de functie write() en voeg output toe als argument om toegang te krijgen tot de geserialiseerde gegevens die je van het monitorstation hebt verzameld.
Loop naar het lichte X-teken boven het blauwe tapijt in het kantoor; op de terminal zullen we de protocollen verifiëren om te bepalen welk type serialisatie de Pickle-module gebruikt bij het verwerken van gegevens. Stel in de voorgeprogrammeerde functie write() de argumenten in op pickle.DEFAULT_PROTOCOL en pickle.HIGHEST_PROTOCOL. Hiermee verifieer je wat het huidige serialisatieprotocol is en wat het nieuwste beschikbare serialisatieprotocol is.
Ga verder naar het donkere X-teken boven het blauwe tapijt; nu we de protocollen hebben bevestigd, kunnen we opgeslagen gegevens verifiëren. Er zijn gegevens verzameld en opgeslagen gedurende de afgelopen maanden in een constante genaamd samples. Maak drie variabelen genaamd: sereal_0, sereal_2 en sereal_5; we zullen deze gebruiken om drie van de beschikbare serialisatieprotocollen te verifiëren. Protocol 0 is leesbaar ASCII, niet erg efficiënt. Protocol 2 is een efficiënter binair formaat en Protocol 5 is het nieuwste met de meest complexe functies.
We slaan de waarde van pickle.dumps() op en stellen als argumenten de constante samples en het protocol dat overeenkomt met het nummer in de variabelenaam. Bijvoorbeeld, voor sereal_0 stellen we het protocol in op 0, zoals dit: sereal_0 = pickle.dumps(samples, protocol=0). Gebruik sereal_0, sereal_2 en sereal_5 met de voorgeprogrammeerde functie display() om te bekijken hoe verschillend de serialisatie is voor elk protocol.
Loop naar het lichte X-teken boven het rode tapijt en ga voor de terminal staan. Overschrijf de variabele output en sla de waarde op van pickle.loads() met sereal_5 als argument om de tot nu toe verzamelde voorbeeldgegevens te deserialiseren. Gebruik de functie display() en voeg de functie pformat() met de variabele output toe om de gegevens te bekijken. Zoals dit: await player.display(pformat(output)). Noteer de waarderingen voor elke maand die in de terminal worden weergegeven, zodat je ze later kunt uittekenen.
Loop naar het donkere X-teken boven het rode tapijt en ga achter het bureau staan. Voeg in de voorgeprogrammeerde functie write() de waarderingen toe die je voor elke maand hebt genoteerd, die eerder in de terminal werden weergegeven. Voeg ze toe als strings met ""-tekens in de juiste volgorde zoals ze in de functie zijn aangegeven, om het level te voltooien.