Avancerad Pythonutvecklingskurs
Kapitel
>
Nivå
Serialiseringsmoduler
Marshal och Pickle-moduler
Mål
Gå till servicestationen och säkerställ att data lagras korrekt genom att använda JSON-modulen för att formatera filer.
På vägen vidare hittar vi några stationer som övervakar vattenfördelningen och jordkvaliteten för marken som utvecklas för en framtida skörd. För att bearbeta data är det effektivt att serialisera den. Även om JSON kan vara en effektiv generell lösning finns det också några Python-specifika serialiseringsmetoder, nämligen marshal- och pickle-modulerna. Marshal-modulen är utformad för snabb serialisering/deserialisering genom att konvertera data till binärt format, vilket är idealiskt för enklare dataöverföringar. Pickle-modulen är långsammare men är utformad för att bearbeta 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 importerar du deras funktioner genom att skriva: import marshal och import pickle. För våra ändamål 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 utföring. 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 för Pickle-serialisering som är den högsta tillgängliga i din Python-version. Protokollen påverkar hur data serialiseras.pickle.dumps(): Serialiserar komplexa Python-datastrukturer i binärt format enligt det protokoll som används. Tar två argument: den data du vill serialisera och den protokollversion du vill använda vid serialiseringen.pickle.loads(): Deserialiserar binär data till Python-läsbara datatyper, kraftfull för Python-objekt. Tar ett argument, nämligen den data du vill deserialisera.
Utöver dessa moduler och funktioner kommer vi också att använda en formateringsmodul som heter pformat, vilken vi importerar med from pprint import pformat. Detta gör att vi kan använda funktionen pformat() för att formatera datastrukturer som ordböcker, vilket gör att vi kan 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 i den närliggande terrängen som utvecklas för att plantera grödor. Det finns en konstant som heter reading, som innehåller Python-data insamlade 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 med den förskrivna funktionen display() för att visa den serialiserade datan.
Gå ut från stationen och gå till det guldfärgade 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 föregående variabel data som argument. Använd funktionen write() och lägg till output som argument för att komma åt den serialiserade datan du samlade in från övervakningsstationen.
Gå till det ljusa X-märket på den blå mattan i kontoret. Vid terminalen kommer vi att verifiera protokollen för att avgöra vilken typ av serialisering pickle-modulen kommer att använda vid databehandling. I den förskrivna funktionen write() sätter du argumenten till pickle.DEFAULT_PROTOCOL och pickle.HIGHEST_PROTOCOL. Detta kommer att verifiera vilket som är det nuvarande serialiseringsprotokollet samt det senaste tillgängliga protokollet för serialisering.
Fortsätt till det mörka X-märket på den blå mattan. Nu när vi har bekräftat protokollen kan vi verifiera lagrad data. Data har samlats in och lagrats under månaderna i en konstant som heter samples. Skapa tre variabler med namnen sereal_0, sereal_2 och sereal_5; dessa kommer vi att använda för att verifiera tre av de tillgängliga serialiseringsprotokollen. 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.
Vi kommer att lagra värdet från pickle.dumps() och som argument ange konstanten samples samt det protocol som motsvarar siffran i variabelnamnet. Till exempel för sereal_0 anger vi protocol som 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 beroende på 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 sereal_5 som argument för att deserialisera provdatan som samlats in hittills. 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)). Observera betygen för varje månad som visas i terminalen så att du kan dokumentera dem senare.
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ägger du till de betyg du noterade för varje månad som tidigare visades i terminalen. Lägg till dem som strängar med dubbla citattecken i rätt ordning enligt funktionens upplägg för att slutföra nivån.