Gevorderde Python-ontwikkelingscursus
Hoofdstuk
>
Niveau
Serialisatie-modules
Marshal en Pickle Modules
Doel
Ga naar het servicestation en zorg ervoor dat gegevens correct worden opgeslagen door gebruik te maken van de JSON-module om bestanden op te maken.
Terwijl je het pad volgt, kom je een paar stations tegen die de waterverdeling en bodemkwaliteit monitoren van het land dat wordt ontwikkeld voor een toekomstige oogst. Om de gegevens te verwerken is het efficiënt om de gegevens te serialiseren. Hoewel het gebruik van Json effectief kan zijn als algemene oplossing, 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 gegevens om te zetten in binair, ideaal voor eenvoudigere gegevensoverdracht. De Pickle-module is langzamer, maar is ontworpen om complexere datastructuren te verwerken en is veel flexibeler, ideaal voor grotere of prioritaire gegevensstructuren.
Om de Marshal- en Pickle-modules te gebruiken, importeer je hun functies door te schrijven: import marshal en import pickle. Voor onze doeleinden zullen we de volgende functies gebruiken:
marshal.dumps(): Serialiseert gegevens naar een binair formaat, 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 door Python leesbare gegevens, beperkt in zijn mogelijkheden maar met een 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 hoe de gegevens worden geserialiseerd.pickle.HIGHEST_PROTOCOL: Controleert welke protocolversie voor Pickle-serialisatie de hoogste is die beschikbaar is in jouw Python-versie. De protocollen beïnvloeden hoe de gegevens worden geserialiseerd.pickle.dumps(): Serialiseert complexe Python-gegevensstructuren naar een binair formaat 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 door Python leesbare gegevens, krachtig in zijn bereik voor Python-objecten. Neemt één argument, namelijk de gegevens die je wilt deserialiseren.
Naast deze modules en functies zullen we ook een formatteringsmodule gebruiken genaamd pformat, die we importeren met from pprint import pformat. Hiermee kunnen we de functie pformat() gebruiken, die gebruikt kan worden om gegevensstructuren zoals dictionaries op te maken, zodat we de informatie duidelijk kunnen weergeven.
Begin door naar het lichtpunt met de X-markering binnenin het kleine bewakingsstation te lopen en richt je op de computerterminal. Het station bewaakt de waterdruk en bodemcondities van het nabije terrein dat ontwikkeld wordt voor het planten van gewassen. Er is een constante genaamd reading, die Python-gegevens bevat die door het station zijn verzameld.
Maak een variabele genaamd data en sla de waarde van de functie marshal.dumps() op, waarbij reading als argument wordt meegegeven. Zo: data = marshal.dumps(reading). Gebruik de variabele data met de voorgeprogrammeerde display() functie om de geserialiseerde variabele data te bekijken.
Loop naar buiten naar het station en ga naar de gouden X-markering. Gebruik de open() functie om de deur te openen en toegang te krijgen tot het kantoor. Loop naar het lichtpunt met de X-markering voor de terminal en deserialiseer de gegevens die je zojuist hebt geserialiseerd. Maak een variabele genaamd output en sla de waarde van marshal.loads() op, waarbij je de eerder verkregen data variabele als argument gebruikt. Gebruik de write() functie en voeg output als argument toe om toegang te krijgen tot de geserialiseerde gegevens die je van het bewakingsstation hebt verzameld.
Loop naar het lichtpunt met de X-markering over het blauwe tapijt in het kantoor. Bij de terminal zullen we de protocollen verifiëren om te bepalen welk type serialisatie de Pickle-module zal gebruiken wanneer gegevens worden verwerkt. Stel in de voorgeprogrammeerde write() functie de argumenten in als pickle.DEFAULT_PROTOCOL en pickle.HIGHEST_PROTOCOL. Hiermee wordt geverifieerd wat het huidige serialisatieprotocol is en wat het nieuwste serialisatieprotocol is dat op dit moment beschikbaar is.
Ga verder naar het donkere X-punt over het blauwe tapijt. Nu we de protocollen hebben bevestigd, kunnen we de opgeslagen gegevens verifiëren. Gegevens zijn over de maanden heen verzameld en opgeslagen in een constante genaamd samples. Maak drie variabelen aan: sereal_0, sereal_2 en sereal_5; we zullen deze gebruiken om drie van de beschikbare serialisatieprotocollen te verifiëren. Protocol 0 is leesbare ASCII, niet erg efficiënt, Protocol 2 is een efficiënter binair formaat en Protocol 5 is het nieuwste met de meest complexe functies toegevoegd.
We zullen de waarde van pickle.dumps() opslaan en als argumenten de sample constante en het protocol dat overeenkomt met het nummer in de variabelenaam instellen. Bijvoorbeeld, voor sereal_0 stellen we het protocol in als 0, zoals dit: sereal_0 = pickle.dumps(samples, protocol=0). Gebruik sereal_0, sereal_2 en sereal_5 met de voorgeprogrammeerde display() functie om te verifiëren hoe verschillend de serialisatie voor elk protocol is.
Loop naar het lichtpunt met de X-markering over het rode tapijt en richt je op de terminal, overschrijf de variabele output en sla de waarde van pickle.loads() op, waarbij je sereal_5 als argument instelt om de tot nu toe verzamelde voorbeeldgegevens te deserialiseren. Gebruik de display() functie en voeg de pformat() functie toe met de variabele output om de gegevens te bekijken. Zo: await player.display(pformat(output)). Noteer de beoordelingen voor elke maand die in de terminal worden weergegeven, zodat je deze later kunt noteren.
Loop naar het donkere X-punt over het rode tapijt en richt je op het bureau. Voeg in de voorgeprogrammeerde write() functie de beoordelingen toe die je genoteerd hebt voor elke maand, zoals eerder in de terminal werd weergegeven. Voeg ze toe als strings met "" aanhalingstekens in de juiste volgorde zoals ze in de functie worden weergegeven om het level te voltooien.