Coding for KidsCoding for Kids
Kreativa NivåerUtmaningarLärarguide
Rösta på funktioner
Avancerad Pythonutvecklingskurs
Kapitel
>
Nivå

Serialiseringsmoduler
Marshal och Pickle-moduler

Mål

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

Fortsätter längs stigen 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 datan är det effektivt att serialisera den. Även om användningen 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 utformad för snabb serialisering/deserialisering genom att konvertera data till binärt format, vilket är idealiskt för enklare datatransfers. Pickle-modulen är långsammare men den är designad för att hantera mer komplexa datastrukturer och är mycket mer flexibel, vilket gör den 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åra ändamål kommer vi att använda följande funktioner:

  • marshal.dumps(): Serialiserar data till ett binärt format, designat för hastighet inom Python. Tar ett argument, den data du vill serialisera, och är begränsat till grundläggande datatyper.
  • marshal.loads(): Deserialiserar binär data till Python-läsliga datatyper, begränsad i sina möjligheter men med snabb exekvering. Tar ett argument, den data som ska deserialiseras.
  • pickle.DEFAULT_PROTOCOL: Kontrollerar vilken protokollversion för pickle-serialisering som är standard i din Python-version. Protokollen påverkar hur data serialiseras.
  • pickle.HIGHEST_PROTOCOL: Kontrollerar vilken protokollversion för pickle-serialisering som är högst tillgänglig 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 serialiseringen.
  • pickle.loads(): Deserialiserar binär data till Python-läsliga datatyper, kraftfull när det gäller Python-objekt. Tar ett argument, den data du vill deserialisera.

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

Börja med att gå till den ljusa X-markeringen inne i den lilla övervakningsstationen och möt 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, vilken innehåller Python-data som samlats in 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 visa den serialiserade variabeln.

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

Gå till den ljusa X-markeringen över den blå mattan på kontoret, vid terminalen kommer vi att verifiera protokollen för att avgöra vilken typ av serialisering pickle-modulen kommer att använda vid databehandlingen. I den förskrivna funktionen write(), ange argumenten som pickle.DEFAULT_PROTOCOL och pickle.HIGHEST_PROTOCOL. Detta kommer att verifiera vilket serialiseringsprotokoll som är aktuellt samt det senaste tillgängliga protokollet.

Fortsätt till den mörka X-markeringen över den blå mattan, nu när vi har bekräftat protokollen kan vi verifiera den lagrade datan. 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. 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 och 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 ange som argument den konstanta 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 olika serialiseringen är för varje protokoll.

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

Gå till den mörka X-markeringen över den röda mattan och möt skrivbordet. I den förskrivna funktionen write(), lägg till de betyg du noterat för varje månad, vilka tidigare visades i terminalen. Lägg till dem som strängar med ""-tecken i rätt ordning, enligt anvisningarna i funktionen, för att slutföra nivån.

Kodbok