Avansert Pythonutviklingskurs
Kapittel
>
Nivå
Serialiseringsmoduler
Marshal og Pickle-moduler
Mål
Gå til servicestasjonen og sørg for at dataene er riktig lagret ved å bruke JSON-modulen for å formatere filer.
Når vi fortsetter langs stien, møter vi noen stasjoner som overvåker vannfordelingen og jordkvaliteten for området som utvikles til en fremtidig høst. 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 data til binært format, noe som er ideelt 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 prioriterte datastrukturer.
For å bruke Marshal- og Pickle-modulene, importer deres funksjoner 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, nemlig dataene du ønsker å serialisere, og er begrenset til grunnleggende datatyper.marshal.loads(): Deserialiserer binære data til Python-lesbare datatyper, begrenset i funksjonalitet, men med rask utførelse. Tar ett argument, nemlig dataene som skal deserialiseres.pickle.DEFAULT_PROTOCOL: Sjekker hvilken protokollversjon for Pickle-serialisering som er standard i din Python-versjon. Protokollene påvirker hvordan data serialiseres.pickle.HIGHEST_PROTOCOL: Sjekker hvilken protokollversjon for Pickle-serialisering som er høyest tilgjengelig i din Python-versjon. Protokollene påvirker hvordan data serialiseres.pickle.dumps(): Serialiserer komplekse Python-datastrukturer til binært format i henhold til den brukte protokollen. Tar to argumenter: dataene du ønsker å serialisere og protokollversjonen du ønsker å bruke under serialiseringen.pickle.loads(): Deserialiserer binære data til Python-lesbare datatyper, med kraftig omfang for Python-objekter. Tar ett argument, nemlig dataene du ønsker å deserialisere.
I tillegg til disse modulene og funksjonene vil vi også bruke en formateringsmodul kalt pprint, som vi importerer med from pprint import pprint. Dette lar oss bruke funksjonen pprint() som kan brukes til å formatere datastrukturer som ordbøker, slik at vi kan vise informasjonen tydelig.
Begynn med å gå til det lyse X-merket inne i den lille overvåkingsstasjonen og vend deg mot datamaskinterminalen. Stasjonen overvåker vanntrykket og jordforholdene i det nærliggende området som utvikles for å dyrke avlinger. Det finnes en konstant kalt reading, som inneholder Python-data samlet inn av stasjonen.
Opprett en variabel kalt data og lagre verdien fra marshal.dumps()-funksjonen med reading som argument. Slik: data = marshal.dumps(reading). Bruk variabelen data sammen med den forhåndsdefinerte display()-funksjonen for å vise de serialiserte variabeldataene.
Gå ut til stasjonen og gå mot det gullfargede 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. Opprett en variabel kalt output og lagre verdien fra marshal.loads() med den tidligere data-variabelen som argument. Bruk write()-funksjonen 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 på kontoret, ved terminalen skal vi verifisere protokollene for å fastslå hvilken type serialisering Pickle-modulen vil bruke under databehandlingen. I den forhåndsdefinerte 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.
Fortsett til det mørke X-merket over det blå teppet, nå som vi har bekreftet protokollene, kan vi verifisere lagrede data. Data har blitt samlet inn og lagret gjennom månedene og er 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 protokollene tilgjengelig for serialisering. 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 komplekse funksjonene lagt til.
Vi vil lagre verdien fra pickle.dumps() og angi samples-konstanten og den tilsvarende protocol-parameteren som argumenter, i henhold til tallet i variabelnavnet. 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åndsdefinerte display()-funksjonen 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 av pickle.loads() med argumentet sereal_5 for å deserialisere prøve-dataene som hittil er samlet inn. Bruk display()-funksjonen og legg inn pprint()-funksjonen med output-variabelen for å vise dataene. Slik: await player.display(pprint(output)). Noter deg vurderingene for hver måned som vises i terminalen, slik at du kan notere dem senere.
Gå til det mørke X-merket over det røde teppet og vend deg mot pulten, og i den forhåndsdefinerte 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 riktig rekkefølge som beskrevet i funksjonen for å fullføre nivået.