Avansert Pythonutviklingskurs
Kapittel
>
Nivå

Serialiseringsmoduler
Marshal- og Pickle-moduler

Mål

Gå til servicesenteret og sørg for at dataene blir lagret riktig ved å bruke JSON-modulen for å formatere filer.

Når du fortsetter langs stien, finner vi noen stasjoner som overvåker vannforsyningen og jordkvaliteten for området som utvikles for en fremtidig innhøsting. For å behandle dataene er det effektivt å serialisere dem. Selv om bruk av Json kan være effektivt som en 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, noe som gjør den ideell for enklere dataoverføringer. Pickle-modulen er tregere, men den er designet for å behandle mer komplekse datastrukturer og er mye mer fleksibel, noe som gjør den ideell for større eller viktige datastrukturer.

For å bruke Marshal- og Pickle-modulene, importer funksjonene deres ved å skrive: import marshal og import pickle. For vårt 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, nemlig dataene du ønsker å serialisere, og er begrenset til grunnleggende datatyper.
  • marshal.loads(): Deserialiserer binære data til Python-lesbare datatyper, begrenset i evner, men med rask utførelse. Tar ett argument, nemlig dataene som skal deserialiseres.
  • pickle.DEFAULT_PROTOCOL: Undersøker hvilken protokollversjon som er standard for Pickle-serialisering i din Python-versjon. Protokollene påvirker hvordan dataene serialiseres.
  • pickle.HIGHEST_PROTOCOL: Undersøker hvilken protokollversjon som er den høyeste tilgjengelige for Pickle-serialisering i din Python-versjon. Protokollene påvirker hvordan dataene serialiseres.
  • pickle.dumps(): Serialiserer komplekse Python-datastrukturer i binært format i henhold til den brukte protokollen. Tar to argumenter, dataene du ønsker å serialisere og protokollversjonen du ønsker å bruke under serialisering.
  • pickle.loads(): Deserialiserer binære data til Python-lesbare datatyper, kraftig i omfang for Python-objekter. Tar ett argument, nemlig dataene du ønsker å deserialisere.

I tillegg til disse modulene og funksjonene vil vi også bruke en formatteringsmodul kalt pformat, som vi importerer med from pprint import pformat. Dette lar oss bruke funksjonen pformat() som kan formatere datastrukturer som ordbøker, slik at vi kan vise informasjonen tydelig.

For å starte, gå til det lyse X-merket inne i den lille overvåkingsstasjonen og vend deg mot dataterminalen. Stasjonen overvåker vanntrykket og jordforholdene i det nærliggende området som utvikles for å plante avlinger. Det finnes en konstant ved navn reading, som inneholder Python-data samlet inn av stasjonen.

Opprett en variabel kalt data og lagre verdien fra funksjonen marshal.dumps() med reading som argument. Slik: data = marshal.dumps(reading). Bruk variabelen data med den forhåndsskrevne funksjonen display() for å vise den serialiserte variabelen.

Gå ut til stasjonen og gå mot det gullfargede X-merket, bruk funksjonen open() for å åpne døren og få tilgang til kontoret. Gå til det lyse X-merket foran terminalen, og deserialiser dataene du nettopp serialiserte. Opprett en variabel kalt output og lagre verdien fra marshal.loads() med den tidligere data-variabelen som argument. Bruk funksjonen write() og legg til output som et argument for å få tilgang til de serialiserte dataene du samlet inn fra overvåkingsstasjonen.

Gå til det lyse X-merket over det blå teppet i kontoret, ved terminalen skal vi verifisere protokollene for å bestemme hvilken type serialisering Pickle-modulen vil bruke når den prosesserer data. I den forhåndsskrevne write()-funksjonen, sett argumentene til pickle.DEFAULT_PROTOCOL og pickle.HIGHEST_PROTOCOL. Dette vil verifisere hva den nåværende serialiseringsprotokollen er, samt den nyeste tilgjengelige serialiseringsprotokollen for øyeblikket.

Fortsett til det mørke X-merket over det blå teppet, nå som vi har bekreftet protokollene kan vi verifisere de lagrede dataene. Data har blitt samlet inn og lagret gjennom månedene og lagret i en konstant kalt samples. Opprett tre variabler kalt: sereal_0, sereal_2 og sereal_5; vi vil bruke disse for å verifisere tre av de tilgjengelige serialiseringsprotokollene. Protokoll 0 er lesbar ASCII, men ikke veldig effektiv, Protokoll 2 er et mer effektivt binært format, og Protokoll 5 er den nyeste med de mest komplekse funksjonene tilført.

Vi vil lagre verdien fra pickle.dumps() og sette som argumenter konstanten samples og protocol tilsvarende tallet i variabelnavnet. For eksempel, for sereal_0 vil vi sette 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 å verifisere hvor forskjellig serialiseringen er for hver protokoll.

Gå til det lyse X-merket over det røde teppet og vend deg mot terminalen, overskriv variabelen output og lagre verdien fra pickle.loads() med argumentet satt til sereal_5 for å deserialisere prøve dataene som har blitt samlet inn så langt. Bruk funksjonen display() og legg til funksjonen pformat() med output-variabelen for å se dataene. Slik: await player.display(pformat(output)). Noter vurderingene for hver måned som vises i terminalen, slik at du kan notere dem ned senere.

Gå til det mørke X-merket over det røde teppet og vend deg mot pulten, i den forhåndsskrevne write()-funksjonen, legg til vurderingene du noterte for hver måned, som tidligere ble vist i terminalen. Legg dem til som strenger med ""-tegn i korrekt rekkefølge, slik de er angitt i funksjonen, for å fullføre nivået.

Kodebok