Avanceret Python Udviklingskursus
Kapitel
>
Niveau
Serialiseringsmoduler
Marshal og Pickle moduler
Mål
Gå til servicestationen og sørg for, at data bliver korrekt gemt ved at bruge JSON-modulet til at formatere filer.
Mens vi fortsætter langs stien, finder vi et par stationer, der overvåger vanddistributionen og jordkvaliteten for det land, som bliver udviklet til en fremtidig høst. For at behandle dataene er det effektivt at serialisere dem. Selvom brug af JSON kan være en effektiv generel løsning, findes der også nogle Python-specifikke serialiseringsmetoder, nemlig Marshal- og Pickle-modulerne. Marshal-modulet er designet til hurtig serialisering/deserialisering ved at konvertere data til binært format, hvilket er ideelt til enklere dataoverførsler. Pickle-modulet er langsommere, men det er designet til at behandle mere komplekse datastrukturer og er meget mere fleksibelt, hvilket gør det ideelt til større eller prioriterede datastrukturer.
For at bruge Marshal- og Pickle-modulerne skal du importere deres funktioner ved at skrive: import marshal og import pickle. Til vores formål bruger vi følgende funktioner:
marshal.dumps(): Serialiserer data til et binært format, designet til hastighed inden for Python. Funktionen tager ét argument, nemlig de data du ønsker at serialisere, og er begrænset til grundlæggende datatyper.marshal.loads(): Deserialiserer binære data til Python-læsbare datatyper, begrænset i sine kapaciteter men med hurtig eksekvering. Funktionen tager ét argument, nemlig de data, der skal deserialiseres.pickle.DEFAULT_PROTOCOL: Kontrollerer, hvilken protokolversion til Pickle-serialisering der er standard i din Python-version. Protokollerne påvirker, hvordan dataene serialiseres.pickle.HIGHEST_PROTOCOL: Kontrollerer, hvilken protokolversion til Pickle-serialisering der er den højeste tilgængelige i din Python-version. Protokollerne påvirker, hvordan dataene serialiseres.pickle.dumps(): Serialiserer komplekse Python-datastrukturer til et binært format i henhold til den anvendte protokol. Funktionen tager to argumenter: de data, du ønsker at serialisere, og den protokolversion, du ønsker at anvende under serialiseringen.pickle.loads(): Deserialiserer binære data til Python-læsbare datatyper, kraftfuld i omfang for Python-objekter. Funktionen tager ét argument, nemlig de data, du ønsker at deserialisere.
Derudover vil vi bruge et formateringsmodul kaldet pprint, som vi importerer med from pprint import pprint. Dette giver os mulighed for at bruge funktionen pprint(), som kan formatere datastrukturer som fx ordbøger, så vi tydeligt kan vise informationen.
For at komme i gang, gå til lys X-mærket inde i den lille overvågningsstation og vend dig mod computerterminalen. Stationen overvåger vandtrykket og jordforholdene i det nærliggende terræn, der er under udvikling til plantning af afgrøder. Der findes en konstant kaldet reading, som indeholder Python-data indsamlet af stationen.
Opret en variabel med navnet data og gem værdien fra funktionen marshal.dumps() med reading som argument. Det skal se sådan ud: data = marshal.dumps(reading). Brug variablen data med den forudskrevne display() funktion for at se den serialiserede variabeldata.
Gå ud til stationen og bevæg dig mod det gyldne X-mærke, brug funktionen open() for at åbne døren og få adgang til kontoret. Gå til lys X-mærket foran terminalen, og deserialiser de data, du netop har serialiseret. Opret en variabel med navnet output og gem værdien fra marshal.loads() med den tidligere data variabel som argument. Brug funktionen write() og tilføj output som et argument for at få adgang til de serialiserede data, du har indsamlet fra overvågningsstationen.
Gå til lys X-mærket over det blå tæppe i kontoret, hvor vi på terminalen vil verificere protokollerne for at bestemme, hvilken type serialisering Pickle-modulet vil bruge under behandling af data. I den forudskrevne write() funktion skal du sætte argumenterne som pickle.DEFAULT_PROTOCOL og pickle.HIGHEST_PROTOCOL. Dette vil verificere, hvad den nuværende serialiseringsprotokol er, samt hvilken den nyeste tilgængelige serialiseringsprotokol er på dette tidspunkt.
Bevæg dig videre til det mørke X-mærke over det blå tæppe, nu hvor vi har bekræftet protokollerne, kan vi verificere de gemte data. Data er blevet indsamlet og gemt i løbet af måneder og opbevaret i en konstant kaldet samples. Opret tre variabler med navnene: sereal_0, sereal_2 og sereal_5. Vi vil bruge disse til at verificere tre af de tilgængelige serialiseringsprotokoller. Protokol 0 er læsbar ASCII, ikke særlig effektiv, protokol 2 er et mere effektivt binært format, og protokol 5 er den nyeste med de mest komplekse funktioner tilføjet.
Vi vil gemme værdien af pickle.dumps() og sætte sample konstanten samt den protocol, der svarer til tallet i variabelnavnet, som argumenter. For eksempel, for sereal_0 sætter vi protocol til 0, således: sereal_0 = pickle.dumps(samples, protocol=0). Brug sereal_0, sereal_2 og sereal_5 med den forudskrevne display() funktion for at verificere, hvor forskellig serialiseringen er for hver protokol.
Gå til lys X-mærket over det røde tæppe og vend dig mod terminalen, overskriv variablen output og gem værdien af pickle.loads() med sereal_5 som argument for at deserialisere de prøve-data, der er blevet indsamlet indtil nu. Brug display() funktionen og tilføj pprint() funktionen med output variablen for at se dataene. Det skal se sådan ud: await player.display(pprint(output)). Notér vurderingerne for hver måned, der vises i terminalen, så du senere kan kortlægge dem.
Gå til det mørke X-mærke over det røde tæppe og vend dig mod skrivebordet, på den forudskrevne write() funktion skal du tilføje de vurderinger, du noterede for hver måned, som tidligere blev vist i terminalen. Tilføj dem som strenge med "" i den korrekte rækkefølge, som de er angivet i funktionen, for at fuldføre niveauet.