Avanceret Python-udviklingskursus
Kapitel
>
Niveau

Serialiseringsmoduler
Marshal- og Pickle-moduler

Mål

Gå til servicestation og sørg for, at data gemmes korrekt ved at bruge JSON-modulet til at formatere filer.

Når vi fortsætter ad stien, finder vi nogle stationer, der overvåger vandfordelingen og jordkvaliteten på det område, der er under udvikling til en fremtidig høst. For at behandle dataene er det effektivt at serialisere dem. Selvom brug af JSON kan være en effektiv og generel løsning, er der også nogle Python-specifikke serialiseringsmetoder, nemlig Marshal- og Pickle-modulerne. Marshal-modulet er designet til hurtig serialisering/deserialisering ved at konvertere dataene til binært format, ideelt til enklere dataoverførsler. Pickle-modulet er langsommere, men det er designet til at behandle mere komplekse datastrukturer og er langt mere fleksibelt, ideelt til større eller prioriterede datastrukturer.

For at bruge Marshal- og Pickle-modulerne importerer du 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 til hastighed i Python. Tager ét argument, nemlig de data, du ønsker at serialisere. 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: Tjekker, hvilken protokolversion der er standard for Pickle-serialisering i din Python-version. Protokollerne påvirker, hvordan dataene serialiseres.
  • pickle.HIGHEST_PROTOCOL: Tjekker, hvilken protokolversion 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 vil bruge ved serialisering.
  • pickle.loads(): Deserialiserer binære data til Python-læselige datatyper med bred dækning for Python-objekter. Tager ét argument: de data, du ønsker at deserialisere.

Ud over disse moduler og funktioner vil vi også bruge et formatteringsmodul ved navn pformat, som vi importerer med from pprint import pformat. Dette giver os mulighed for at bruge funktionen pformat(), som kan formatere datastrukturer som ordbøger, så vi tydeligt kan vise informationen.

For at starte går du til det lyse X-mærke inde i den lille overvågningsstation og vender dig mod computermaskinen. Stationen overvåger vandtrykket og jordforholdene i det nærliggende terræn, der er under udvikling til afgrødeplantning. Der er en konstant ved navn reading, som indeholder Python-data indsamlet af stationen.

Opret en variabel ved navn data og gem værdien fra funktionen marshal.dumps() med reading som argument. Som dette: data = marshal.dumps(reading). Brug variablen data med den foruddefinerede funktion display() for at se de serialiserede data.

Gå ud af stationen og hen til det gyldne X-mærke, brug funktionen open() til at åbne døren og få adgang til kontoret. Gå til det lyse X-mærke foran terminalen, og deserialiser de data, du lige har serialiseret.

Opret en variabel ved navn output og gem værdien fra marshal.loads() med den tidligere data-variabel som argument. Brug funktionen write() og tilføj output som argument for at tilgå de serialiserede data, du har indsamlet fra overvågningsstationen.

Gå til det lyse X-mærke på det blå tæppe i kontoret. På terminalen skal vi verificere protokollerne for at afgøre, hvilken type serialisering pickle-modulet vil bruge ved databehandling. I den foruddefinerede funktion write() indstiller du argumenterne til pickle.DEFAULT_PROTOCOL og pickle.HIGHEST_PROTOCOL. Dette vil verificere, hvad den nuværende serialiseringsprotokol er, samt den nyeste tilgængelige protokol.

Fortsæt til det mørke X-mærke på det blå tæppe. Nu hvor vi har bekræftet protokollerne, kan vi bekræfte de gemte data. Data er indsamlet og gemt igennem månederne i en konstant ved navn samples.

Opret tre variabler ved navn sereal_0, sereal_2 og sereal_5. Vi bruger dem til at verificere tre af de tilgængelige protokoller for serialisering. Protokol 0 er læsbar ASCII og ikke særlig effektiv, protokol 2 er et mere effektivt binært format, og protokol 5 er den nyeste med de mest komplekse funktioner.

Vi gemmer værdien fra pickle.dumps() og sætter som argumenter konstanten samples og den protocol, der svarer 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 foruddefinerede funktion display() for at se, hvor forskellige serialiseringerne er for hver protokol.

Gå til det lyse X-mærke på det røde tæppe og vend dig mod terminalen. Overskriv variablen output og gem værdien fra pickle.loads() med argumentet sereal_5 for at deserialisere de hidtil indsamlede eksempeldata.

Brug funktionen display() og tilføj funktionen pformat() med variablen output for at se dataene. Som dette: await player.display(pformat(output)). Notér bedømmelserne for hver måned, der vises i terminalen, så du kan registrere dem senere.

Gå til det mørke X-mærke på det røde tæppe og vend dig mod skrivebordet. I den foruddefinerede funktion write() tilføjer du de bedømmelser for hver måned, som du noterede fra terminalen.

Tilføj dem som strenge med ""-tegn i den korrekte rækkefølge, som de er angivet i funktionen, for at gennemføre niveauet.

Kodebog