Fortgeschrittener Python-Entwicklungskurs
Kapitel
>
Stufe
Serialisierungs-Module
Marshal- und Pickle-Module
Ziel
Gehe zur Servicestation und stelle sicher, dass die Daten korrekt gespeichert werden, indem du das JSON-Modul zur Formatierung der Dateien verwendest.
Dem Pfad folgend finden wir ein paar Stationen, die die Wasserverteilung und Bodenqualität für das Gebiet überwachen, das für eine zukünftige Ernte entwickelt wird. Um die Daten zu verarbeiten, ist es effizient, sie zu serialisieren. Obwohl JSON als allgemeine Lösung effektiv sein kann, gibt es auch einige Python-spezifische Serialisierungsmethoden, nämlich die Module Marshal und Pickle. Das Marshal-Modul wurde für eine schnelle Serialisierung/Deserialisierung entwickelt, indem es die Daten in ein binäres Format konvertiert und eignet sich ideal für einfachere Datentransfers. Das Pickle-Modul ist langsamer, wurde jedoch entwickelt, um komplexere Datenstrukturen zu verarbeiten, und ist wesentlich flexibler, ideal für umfangreichere oder prioritäre Datenstrukturen.
Um die Module Marshal und Pickle zu verwenden, importiere ihre Funktionen mit import marshal und import pickle. Für unsere Zwecke werden wir die folgenden Funktionen verwenden:
marshal.dumps(): Serialisiert Daten in ein binäres Format, optimiert für Geschwindigkeit in Python. Nimmt ein Argument, nämlich die Daten, die du serialisieren möchtest, und ist auf grundlegende Datentypen beschränkt.marshal.loads(): Deserialisiert binäre Daten in in Python lesbare Datentypen, ist in seinen Fähigkeiten begrenzt, bietet jedoch eine schnelle Ausführung. Nimmt ein Argument, nämlich die zu deserialisierenden Daten.pickle.DEFAULT_PROTOCOL: Prüft, welche Protokollversion für die Pickle-Serialisierung in deiner Python-Version standardmäßig verwendet wird. Die Protokolle beeinflussen, wie die Daten serialisiert werden.pickle.HIGHEST_PROTOCOL: Prüft, welche Protokollversion für die Pickle-Serialisierung in deiner Python-Version die höchste verfügbare ist. Die Protokolle beeinflussen, wie die Daten serialisiert werden.pickle.dumps(): Serialisiert komplexe Python-Datenstrukturen im Binärformat entsprechend dem verwendeten Protokoll. Nimmt zwei Argumente: die zu serialisierenden Daten und die Protokollversion, die du verwenden möchtest.pickle.loads(): Deserialisiert binäre Daten in in Python lesbare Datentypen, mächtig in Bezug auf Python-Objekte. Nimmt ein Argument: die zu deserialisierenden Daten.
Zusätzlich zu diesen Modulen und Funktionen werden wir ein Formatierungsmodul namens pformat verwenden, welches wir mit from pprint import pformat importieren. Dadurch können wir die Funktion pformat() verwenden, um Datenstrukturen wie Dictionaries zu formatieren und die Informationen übersichtlich darzustellen.
Gehe zunächst zum hellen X-Mark in der kleinen Überwachungsstation und stelle dich vor das Computerterminal. Die Station überwacht den Wasserdruck und die Bodenbedingungen des umliegenden Geländes, das für die Bepflanzung entwickelt wird. Es gibt eine Konstante namens reading, die die von der Station gesammelten Python-Daten enthält.
Erstelle eine Variable namens data und speichere den Wert der Funktion marshal.dumps(), wobei du reading als Argument übergibst. Zum Beispiel: data = marshal.dumps(reading). Verwende die Variable data mit der vorgefertigten Funktion display(), um die serialisierten Variablendaten anzuzeigen.
Verlasse die Station und gehe zum goldenen X-Mark, nutze die Funktion open(), um die Tür zu öffnen und Zugang zum Büro zu erhalten. Gehe zum hellen X-Mark vor dem Terminal und deserialisiere die zuvor serialisierten Daten. Erstelle eine Variable namens output und speichere den Wert von marshal.loads(), wobei du die vorherige Variable data als Argument übergibst. Verwende die Funktion write() und füge output als Argument hinzu, um auf die gesammelten Daten aus der Überwachungsstation zuzugreifen.
Gehe zum hellen X-Mark auf dem blauen Teppich im Büro. An dem Terminal werden wir die Protokolle überprüfen, um festzustellen, welchen Serialisierungstyp das Pickle-Modul bei der Datenverarbeitung verwendet. Setze in der vorgefertigten Funktion write() die Argumente auf pickle.DEFAULT_PROTOCOL und pickle.HIGHEST_PROTOCOL. Dadurch werden das aktuelle Serialisierungsprotokoll sowie das jeweils höchste verfügbare Protokoll überprüft.
Gehe zum dunklen X-Mark auf dem blauen Teppich. Nachdem wir die Protokolle bestätigt haben, können wir nun gespeicherte Daten überprüfen. Im Laufe der Monate wurden Daten gesammelt und in einer Konstante namens samples gespeichert. Erstelle drei Variablen namens sereal_0, sereal_2 und sereal_5. Wir werden sie verwenden, um drei der verfügbaren Serialisierungsprotokolle zu überprüfen. Protokoll 0 ist lesbares ASCII und nicht sehr effizient. Protokoll 2 ist ein effizienteres Binärformat, und Protokoll 5 ist das aktuellste mit den umfangreichsten Funktionen.
Wir speichern den Wert von pickle.dumps() und übergeben als Argumente die Konstante samples und das Protokoll, das der Zahl im Variablennamen entspricht. Für sereal_0 setzen wir beispielsweise protocol=0, wie hier: sereal_0 = pickle.dumps(samples, protocol=0). Verwende sereal_0, sereal_2 und sereal_5 mit der vorgefertigten Funktion display(), um zu überprüfen, wie unterschiedlich die Serialisierung bei jedem Protokoll ausfällt.
Gehe zum hellen X-Mark auf dem roten Teppich und stelle dich vor das Terminal. Überschreibe die Variable output und speichere den Wert von pickle.loads(), wobei du sereal_5 als Argument verwendest, um die bisher gesammelten Musterdaten zu deserialisieren. Verwende die Funktion display() und füge die Funktion pformat() mit der Variable output hinzu, um die Daten anzuzeigen. Zum Beispiel: await player.display(pformat(output)). Notiere dir die Bewertungen für jeden Monat, die im Terminal angezeigt werden, damit du sie später aufzeichnen kannst.
Gehe zum dunklen X-Mark auf dem roten Teppich und stelle dich zum Schreibtisch. Füge in der vorgefertigten Funktion write() die Bewertungen ein, die du dir für jeden Monat notiert hast und die zuvor im Terminal angezeigt wurden. Gib sie als Strings mit Anführungszeichen ("") in der richtigen Reihenfolge ein, wie sie in der Funktion vorgegeben ist, um das Level abzuschließen.