Avansert Python-utviklingskurs
Kapittel
>
Nivå
Serialiseringsmoduler
Marshal- og Pickle-modulene
Mål
Gå til servicestasjonen og sørg for at dataene lagres riktig ved å bruke JSON-modulen for å formatere filene.
Når vi fortsetter langs stien, finner vi noen stasjoner som overvåker vannfordelingen og jordkvaliteten for området som blir utviklet for en fremtidig innhøsting. For å behandle dataene er det effektivt å serialisere dem. Selv om bruk av JSON kan være en effektiv, generell løsning, finnes det også noen Python-spesifikke serialiseringsmetoder, nemlig Marshal- og Pickle-modulene. Marshal-modulen er designet for rask serialisering/deserialisering ved å konvertere dataene til binært format, ideelt for enklere dataoverføringer. Pickle-modulen er tregere, men den er laget for å behandle mer komplekse datastrukturer og er mye mer fleksibel, ideell for større eller prioriterte datastrukturer.
For å bruke Marshal- og Pickle-modulene importerer du funksjonene deres ved å skrive: import marshal og import pickle. For våre formål vil vi bruke følgende funksjoner:
marshal.dumps(): Serialiserer data til et binært format, designet for hastighet i Python. Tar ett argument, som er dataene du ønsker å serialisere, og er begrenset til grunnleggende datatyper.marshal.loads(): Deserialiserer binære data til Python-lesbare datatyper, begrenset i sine muligheter, men med rask utførelse. Tar ett argument, som er dataene som skal deserialiseres.pickle.DEFAULT_PROTOCOL: Kontrollerer hvilken protokollversjon som er standard for Pickle-serialisering i din Python-versjon. Protokollene påvirker hvordan dataene serialiseres.pickle.HIGHEST_PROTOCOL: Kontrollerer hvilken protokollversjon som er høyest tilgjengelig i din Python-versjon. Protokollene påvirker hvordan dataene serialiseres.pickle.dumps(): Serialiserer komplekse Python-datastrukturer til binært format i henhold til protokollen som brukes. Tar to argumenter: dataene du ønsker å serialisere og protokollversjonen du vil bruke ved serialisering.pickle.loads(): Deserialiserer binære data til Python-lesbare datatyper, kraftfull for Python-objekter. Tar ett argument, som er dataene du ønsker å deserialisere.
I tillegg til disse modulene og funksjonene vil vi også bruke en formateringsmodul kalt pformat, som vi importerer med from pprint import pformat. Dette lar oss bruke funksjonen pformat(), som kan brukes til å formatere datastrukturer som ordbøker, slik at vi kan vise informasjonen tydelig.
For å starte går du til det lyse X-merket inne i den lille overvåkingsstasjonen og vender deg mot dataterminalen. Stasjonen overvåker vanntrykket og jordforholdene i det nærliggende terrenget som utvikles for å plante avlinger. Det finnes en konstant kalt reading, som inneholder Python-data samlet inn av stasjonen.
Lag en variabel kalt data og lagre verdien fra marshal.dumps()-funksjonen ved å bruke reading som argument, slik: data = marshal.dumps(reading). Bruk variabelen data med den forhåndsskrevne funksjonen display() for å vise de serialiserte dataene.
Gå tilbake til stasjonen og gå mot det gyldne X-merket, bruk open()-funksjonen for å åpne døren og få tilgang til kontoret. Gå til det lyse X-merket foran terminalen, og deserialiser dataene du nettopp serialiserte. Lag en variabel kalt output og lagre verdien fra marshal.loads() ved å bruke den tidligere variabelen data som argument. Bruk funksjonen write() og legg til output som argument for å få tilgang til de serialiserte dataene du samlet fra overvåkingsstasjonen.
Gå til det lyse X-merket på det blå teppet i kontoret. På terminalen skal vi verifisere protokollene for å avgjøre hvilken type serialisering Pickle-modulen vil bruke når den behandler data. I den forhåndsskrevne write()-funksjonen setter du argumentene til pickle.DEFAULT_PROTOCOL og pickle.HIGHEST_PROTOCOL. Dette vil bekrefte hva som er den gjeldende serialiseringsprotokollen, samt den nyeste protokollen som er tilgjengelig nå.
Gå videre til det mørke X-merket på det blå teppet. Nå som vi har bekreftet protokollene, kan vi verifisere lagrede data. Data er blitt samlet inn og lagret gjennom månedene i en konstant kalt samples. Lag tre variabler kalt sereal_0, sereal_2 og sereal_5; vi vil bruke disse til å verifisere tre av serialiseringsprotokollene som er tilgjengelige. Protokoll 0 er lesbar ASCII, ikke veldig effektiv; protokoll 2 er et mer effektivt binært format, og protokoll 5 er den nyeste med de mest avanserte funksjonene.
Vi vil lagre verdien fra pickle.dumps() og bruke konstanten samples og protokollen som tilsvarer tallet i variabelnavnet som argumenter. For eksempel, for sereal_0 setter vi protocol til 0, slik: sereal_0 = pickle.dumps(samples, protocol=0). Bruk sereal_0, sereal_2 og sereal_5 med den forhåndsskrevne funksjonen display() for å se hvor forskjellig serialiseringen er for hver protokoll.
Gå til det lyse X-merket på det røde teppet og vend deg mot terminalen. Overskriv variabelen output og lagre verdien fra pickle.loads(), bruk sereal_5 som argument for å deserialisere sample-dataene som er samlet inn så langt. Bruk funksjonen display() og legg til funksjonen pformat() med variabelen output for å vise dataene. Slik: await player.display(pformat(output)). Noter vurderingene for hver måned som vises i terminalen, slik at du kan plotte dem senere.
Gå til det mørke X-merket på det røde teppet og vend deg mot skrivebordet. I den forhåndsskrevne write()-funksjonen legger du til vurderingene du noterte for hver måned, som tidligere ble vist i terminalen. Legg dem inn som strenger med ""-tegn i riktig rekkefølge som angitt i funksjonen for å fullføre nivået.