Fortgeschrittener Python-Entwicklungskurs
Kapitel
>
Stufe

Serialisierungsmodule
Marshal- und Pickle-Module

Ziel

Gehe zur Servicestation und stelle sicher, dass Daten ordnungsgemäß gespeichert werden, indem du das JSON-Modul zur Formatierung von Dateien verwendest.

Während du den Pfad entlanggehst, finden wir einige Stationen, die die Wasserverteilung und Bodenqualität des Landes überwachen, das für eine zukünftige Ernte entwickelt wird. Um die Daten zu verarbeiten, ist es effizient, die Daten zu serialisieren. Zwar kann die Verwendung von Json als allgemeine Lösung effektiv sein, es gibt jedoch auch einige Python-spezifische Serialisierungsmethoden, nämlich die Module Marshal und Pickle. Das Marshal-Modul ist für schnelle Serialisierung/Deserialisierung konzipiert, indem es die Daten in Binärform umwandelt, ideal für einfachere Datentransfers. Das Pickle-Modul ist langsamer, dafür aber für die Verarbeitung komplexerer Datenstrukturen ausgelegt und wesentlich flexibler, ideal für größere oder priorisierte Datenstrukturen.

Um die Module Marshal und Pickle zu verwenden, importiere ihre Funktionen, indem du schreibst: import marshal und import pickle. Für unsere Zwecke verwenden wir die folgenden Funktionen:

  • marshal.dumps(): Serialisiert Daten in ein Binärformat, ausgelegt auf Geschwindigkeit innerhalb von Python. Nimmt ein Argument entgegen, nämlich die Daten, die du serialisieren möchtest, und ist auf grundlegende Datentypen beschränkt.
  • marshal.loads(): Deserialisiert binäre Daten in von Python lesbare Datentypen, begrenzt in seinen Möglichkeiten, aber mit schneller Ausführung. Nimmt ein Argument entgegen, nämlich die zu deserialisierenden Daten.
  • pickle.DEFAULT_PROTOCOL: Überprü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: Überprüft, welche Protokollversion für die Pickle-Serialisierung in deiner Python-Version als die höchste verfügbar ist. Die Protokolle beeinflussen, wie die Daten serialisiert werden.
  • pickle.dumps(): Serialisiert komplexe Python-Datenstrukturen in ein Binärformat entsprechend dem verwendeten Protokoll. Nimmt zwei Argumente entgegen, die Daten, die du serialisieren möchtest, und die Protokollversion, die du beim Serialisieren verwenden möchtest.
  • pickle.loads(): Deserialisiert binäre Daten in von Python lesbare Datentypen, leistungsstark in Bezug auf Python-Objekte. Nimmt ein Argument entgegen, nämlich die Daten, die du deserialisieren möchtest.

Zusätzlich zu diesen Modulen und Funktionen werden wir auch ein Formatierungsmodul namens pformat verwenden, das wir mit from pprint import pformat importieren. Dadurch können wir die Funktion pformat() verwenden, mit der sich Datenstrukturen wie Dictionaries formatieren lassen, sodass wir die Informationen übersichtlich anzeigen können.

Beginne, indem du zum Licht-X-Marke in der kleinen Überwachungsstation gehst und dich dem Computerterminal zuwendest. Die Station überwacht den Wasserdruck und die Bodenbedingungen des nahen Geländes, das für den Anbau von Nutzpflanzen entwickelt wird. Es gibt eine Konstante namens reading, die Python-Daten enthält, die von der Station gesammelt wurden.

Erstelle eine Variable namens data und speichere den Wert der marshal.dumps()-Funktion, wobei du reading als Argument setzt. So: data = marshal.dumps(reading). Verwende die Variable data mit der vorgegebenen display()-Funktion, um die serialisierten Variablendaten anzuzeigen.

Gehe zur Station hinaus und begib dich zur goldenen X-Marke, benutze die open()-Funktion, um die Tür zu öffnen und Zugang zum Büro zu erhalten. Gehe zur Licht-X-Marke vor dem Terminal und deserialisiere die Daten, die du gerade serialisiert hast. Erstelle eine Variable namens output und speichere den Wert von marshal.loads() mit der vorherigen Variable data als Argument. Verwende die write()-Funktion und füge output als Argument hinzu, um auf die von der Überwachungsstation gesammelten serialisierten Daten zuzugreifen.

Gehe zur Licht-X-Marke über den blauen Teppich im Büro, am Terminal werden wir die Protokolle überprüfen, um festzustellen, welche Art der Serialisierung das Pickle-Modul bei der Datenverarbeitung verwendet. Setze in der vorgegebenen write()-Funktion die Argumente auf pickle.DEFAULT_PROTOCOL und pickle.HIGHEST_PROTOCOL. Dadurch wird überprüft, welches das aktuelle Serialisierungsprotokoll ist sowie das neueste aktuell verfügbare Serialisierungsprotokoll.

Bewege dich zur dunklen X-Marke über den blauen Teppich. Jetzt, wo wir die Protokolle bestätigt haben, können wir die gespeicherten Daten überprüfen. Daten wurden über die Monate hinweg gesammelt und in einer Konstante namens samples gespeichert. Erstelle drei Variablen namens: sereal_0, sereal_2 und sereal_5. Wir werden diese verwenden, um drei der für die Serialisierung verfügbaren Protokolle zu überprüfen. Protokoll 0 ist lesbares ASCII, nicht sehr effizient, Protokoll 2 ist ein effizienteres Binärformat, und Protokoll 5 ist das neueste mit den komplexesten Funktionen.

Wir werden den Wert von pickle.dumps() speichern und als Argumente die Konstante samples sowie das protocol entsprechend der Zahl im Variablennamen angeben. Zum Beispiel setzen wir für sereal_0 das protocol auf 0, so: sereal_0 = pickle.dumps(samples, protocol=0). Verwende die Variablen sereal_0, sereal_2 und sereal_5 mit der vorgegebenen display()-Funktion, um zu überprüfen, wie unterschiedlich die Serialisierung für jedes Protokoll ist.

Gehe zur Licht-X-Marke über den roten Teppich und wende dich dem Terminal zu, überschreibe die Variable output und speichere den Wert von pickle.loads(), indem du sereal_5 als Argument setzt, um die bisher gesammelten Beispieldaten zu deserialisieren. Verwende die display()-Funktion und füge die pformat()-Funktion mit der Variable output hinzu, um die Daten anzuzeigen. So: 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 zur dunklen X-Marke über den roten Teppich und wende dich dem Schreibtisch zu. Füge in der vorgegebenen write()-Funktion die Bewertungen hinzu, die du dir für jeden Monat notiert hast und die zuvor im Terminal angezeigt wurden. Füge sie als Strings mit ""-Anführungszeichen in der in der Funktion vorgegebenen Reihenfolge hinzu, um das Level abzuschließen.

Codebuch