Avanceret Python Udviklingskursus
Kapitel
>
Niveau

Serialisering-moduler
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.

Når vi fortsætter langs stien, finder vi et par stationer, der overvåger vandfordelingen og jordkvaliteten for det areal, der er under udvikling til en fremtidig høst. For at behandle dataene er det effektivt at serialisere dataene. Selvom brug af Json kan være effektivt som en generel løsning, findes der også et par Python-specifikke serialiseringsmetoder, nemlig Marshal- og Pickle-modulerne. Marshal-modulet er designet til hurtig serialisering/deserialisering ved at konvertere dataene til binært format, hvilket er ideelt til enklere datatransfers. Pickle-modulet er langsommere, men er designet til at behandle mere komplekse datastrukturer og er meget mere fleksibelt, hvilket er 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 vil vi bruge følgende funktioner:

  • marshal.dumps(): Serialiserer data til et binært format, designet for fart inden for Python. 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æselige datatyper, begrænset i sine muligheder, men med hurtig udførelse. Tager ét argument, nemlig de data, der skal deserialiseres.
  • pickle.DEFAULT_PROTOCOL: Checker hvilken protokolversion for Pickle-serialisering, der er standard i din Python-version. Protokollerne påvirker, hvordan dataene serialiseres.
  • pickle.HIGHEST_PROTOCOL: Checker hvilken protokolversion for 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 i binært format i henhold til den anvendte protokol. Tager to argumenter, de data du ønsker at serialisere og den protokolversion, du ønsker at bruge ved serialiseringen.
  • pickle.loads(): Deserialiserer binære data til Python-læselige datatyper, med bred anvendelse for Python-objekter. Tager ét argument, nemlig de data, du ønsker at deserialisere.

Derudover vil vi også bruge et formateringsmodul ved navn pformat, som vi importerer med from pprint import pformat. Dette giver os mulighed for at bruge funktionen pformat(), som kan anvendes til at formatere datastrukturer som ordbøger, så vi tydeligt kan vise informationen.

For at komme i gang, gå til det lyse X-mærke inde i den lille overvågningsstation og vend dig mod computerterminalen. Stationen overvåger vandtrykket og jordtilstanden i det nærliggende terræn, der er under udvikling til dyrkning af afgrøder. Der er en konstant med navnet 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. På denne måde: 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 det lyse X-mærke foran terminalen, og deserialiser de data, du netop har serialiseret. Opret en variabel med navnet output og gem værdien af marshal.loads() med den tidligere data-variabel som argument. Brug funktionen write() og tilføj output som argument for at få adgang til de serialiserede data, du har indsamlet fra overvågningsstationen.

Gå til det lyse X-mærke over det blå tæppe i kontoret, ved terminalen skal vi verificere protokollerne for at bestemme, hvilken type serialisering Pickle-modulet vil bruge, når data behandles. 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 den seneste tilgængelige serialiseringsprotokol på nuværende tidspunkt.

Fortsæt til det mørke X-mærke over det blå tæppe, nu hvor vi har bekræftet protokollerne, kan vi nu verificere de gemte data. Data er blevet indsamlet og lagret over måneder og gemt i en konstant med navnet samples. Opret tre variable 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 som argumenter konstanten samples og protocol svarende til tallet i variabelnavnet. For eksempel, for sereal_0 sætter vi protocol til 0, på denne måde: 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 det lyse X-mærke over det røde tæppe og vend dig mod terminalen, overskriv variablen output og gem værdien af pickle.loads(), hvor du sætter argumentet til sereal_5 for at deserialisere de prøve-data, der hidtil er blevet indsamlet. Brug funktionen display() og tilføj funktionen pformat() med variablen output for at se dataene. På denne måde: await player.display(pformat(output)). Notér dig ratings for hver måned, som vises i terminalen, så du senere kan nedskrive 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 ratings, du har noteret for hver måned, som tidligere blev vist i terminalen. Tilføj dem som strenge med "" omkring, i den korrekte rækkefølge, som de er angivet i funktionen, for at fuldføre niveauet.

Kodebog