Avancerad Pythonutvecklingskurs
Kapitel
>
Nivå

Serialiseringsmoduler
Marshal och Pickle-moduler

Mål

Gå till service stationen och se till att data lagras korrekt genom att använda JSON-modulen för att formatera filer.

När du fortsätter längs stigen hittar vi några stationer som övervakar vattenfördelningen och jordkvaliteten på den mark som utvecklas för en framtida skörd. För att bearbeta datan är det effektivt att serialisera den. Medan användning av JSON kan vara effektivt som en generell lösning finns det även några Python-specifika serialiseringsmetoder, nämligen Marshal- och Pickle-modulerna. Marshal-modulen är designad för snabb serialisering/deserialisering genom att konvertera data till binär form, vilket är idealiskt för enklare dataöverföringar. Pickle-modulen är långsammare, men den är utformad för att hantera mer komplexa datastrukturer och är mycket mer flexibel, idealisk för större eller prioriterade datastrukturer.

För att använda Marshal- och Pickle-modulerna, importera deras funktioner genom att skriva: import marshal och import pickle. För vårt syfte kommer vi att använda följande funktioner:

  • marshal.dumps(): Serialiserar data till ett binärt format, utformat för snabbhet i Python. Tar ett argument, nämligen den data du vill serialisera, och är begränsad till grundläggande datatyper.
  • marshal.loads(): Deserialiserar binär data till Python-läsbara datatyper, begränsad i sina möjligheter men med snabb exekvering. Tar ett argument, nämligen den data som ska deserialiseras.
  • pickle.DEFAULT_PROTOCOL: Kontrollerar vilken protokollversion som är standard för Pickle-serialisering i din Python-version. Protokollen påverkar hur data serialiseras.
  • pickle.HIGHEST_PROTOCOL: Kontrollerar vilken protokollversion som är den högsta tillgängliga för Pickle-serialisering i din Python-version. Protokollen påverkar hur data serialiseras.
  • pickle.dumps(): Serialiserar komplexa Python-datastrukturer i binärt format enligt det använda protokollet. Tar två argument: den data du vill serialisera och den protokollversion du vill använda vid serialisering.
  • pickle.loads(): Deserialiserar binär data till Python-läsbara datatyper, kraftfull när det gäller Python-objekt. Tar ett argument, nämligen den data du vill deserialisera.

Förutom dessa moduler och funktioner kommer vi även att använda en formatteringsmodul som heter pformat, som vi importerar med from pprint import pformat. Detta gör att vi kan använda funktionen pformat() som kan användas för att formatera datastrukturer, som ordböcker, och på så sätt visa informationen tydligt.

Börja med att gå till det ljusa X-märket inne i den lilla övervakningsstationen och vänd dig mot datorterminalen. Stationen övervakar vattentrycket och jordförhållandena på det närliggande området som utvecklas för odling av grödor. Det finns en konstant som heter reading som innehåller Python-data insamlad av stationen.

Skapa en variabel som heter data och lagra värdet från funktionen marshal.dumps() med reading som argument. Så här: data = marshal.dumps(reading). Använd variabeln data tillsammans med den förskrivna funktionen display() för att se den serialiserade variabeldatan.

Gå ut till stationen och gå mot det gyllene X-märket, använd funktionen open() för att öppna dörren och få tillgång till kontoret. Gå till det ljusa X-märket framför terminalen och deserialisera den data du just serialiserade. Skapa en variabel som heter output och lagra värdet från marshal.loads() med den tidigare variabeln data som argument. Använd funktionen write() och lägg till output som argument för att komma åt den serialiserade data du samlat in från övervakningsstationen.

Gå till det ljusa X-märket på den blå mattan i kontoret, vid terminalen ska vi verifiera protokollen för att fastställa vilken typ av serialisering Pickle-modulen kommer att använda vid bearbetningen av data. I den förskrivna funktionen write() ställ in argumenten till pickle.DEFAULT_PROTOCOL och pickle.HIGHEST_PROTOCOL. Detta kommer att verifiera både nuvarande serialiseringsprotokoll och det senaste tillgängliga serialiseringsprotokollet.

Fortsätt till det mörka X-märket på den blå mattan, nu när vi har bekräftat protokollen kan vi verifiera den lagrade datan. Data har samlats in under flera månader och lagrats i en konstant som heter samples. Skapa tre variabler med namnen: sereal_0, sereal_2 och sereal_5. Vi kommer att använda dessa för att verifiera tre av de protokoll som finns tillgängliga för serialisering. Protokoll 0 är läsbar ASCII, inte särskilt effektivt. Protokoll 2 är ett mer effektivt binärt format och Protokoll 5 är det senaste med de mest komplexa funktionerna tillagda.

Vi kommer att lagra värdet från pickle.dumps() och ställa in argumenten till konstanten samples och det protocol som motsvarar siffran i variabelnamnet. Till exempel, för sereal_0 kommer vi att använda protocol 0, så här: sereal_0 = pickle.dumps(samples, protocol=0). Använd sereal_0, sereal_2 och sereal_5 med den förskrivna funktionen display() för att verifiera hur serialiseringen skiljer sig för varje protokoll.

Gå till det ljusa X-märket på den röda mattan och vänd dig mot terminalen, skriv över variabeln output och lagra värdet från pickle.loads() med argumentet sereal_5 för att deserialisera det provdata som hittills samlats in. Använd funktionen display() och lägg till funktionen pformat() med variabeln output för att visa datan. Så här: await player.display(pformat(output)). Notera betygsättningen för varje månad som visas i terminalen så att du senare kan anteckna dem.

Gå till det mörka X-märket på den röda mattan och vänd dig mot skrivbordet. I den förskrivna funktionen write(), lägg till de betyg du noterade för varje månad, vilka tidigare visades i terminalen. Lägg till dem som strängar inom ""-tecken i rätt ordning enligt funktionen för att slutföra nivån.

Kodbok