Coding for KidsCoding for Kids
Kreative LevelHerausforderungenLehrerhandbuch
Für Funktionen abstimmen
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.

Auf dem weiteren Weg stoßen wir auf einige Stationen, die die Wasserversorgung und die Bodenqualität des Geländes überwachen, das für eine zukünftige Ernte erschlossen wird. Um die Daten zu verarbeiten, ist es effizient, sie zu serialisieren. Während die Verwendung von Json als allgemein einsetzbare Lösung effektiv sein kann, gibt es auch einige Python-spezifische Serialisierungsmethoden, nämlich die Module Marshal und Pickle. Das Marshal-Modul ist auf schnelle Serialisierung/Deserialisierung ausgelegt, indem es die Daten in ein Binärformat umwandelt – ideal für einfachere Datentransfers. Das Pickle-Modul ist langsamer, wurde jedoch entwickelt, um komplexere Datenstrukturen zu verarbeiten und ist deutlich flexibler, ideal für umfangreichere 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 werden wir die folgenden Funktionen verwenden:

  • marshal.dumps(): Serialisiert Daten in ein Binärformat, das auf Geschwindigkeit innerhalb von Python ausgelegt ist. Nimmt ein Argument, nämlich die Daten, die du serialisieren möchtest, und ist auf grundlegende Datentypen beschränkt.
  • marshal.loads(): Deserialisiert Binärdaten in pythonlesbare Datentypen, in seinen Fähigkeiten begrenzt, aber mit schneller 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 die höchste in deiner Python-Version verfügbare ist. Die Protokolle beeinflussen, wie die Daten serialisiert werden.
  • pickle.dumps(): Serialisiert komplexe Python-Datenstrukturen im Binärformat gemäß dem verwendeten Protokoll. Nimmt zwei Argumente, nämlich die Daten, die du serialisieren möchtest, und die Protokollversion, die du dabei verwenden möchtest.
  • pickle.loads(): Deserialisiert Binärdaten in pythonlesbare Datentypen und ist leistungsstark im Umgang mit Python-Objekten. Nimmt ein Argument, nämlich die Daten, die du deserialisieren möchtest.

Zusätzlich zu diesen Modulen und Funktionen werden wir auch ein Formatierungsmodul namens pprint verwenden, das wir mit from pprint import pprint importieren. Dies ermöglicht uns die Funktion pprint(), mit der Datenstrukturen wie Wörterbücher so formatiert werden, dass die Informationen klar dargestellt werden.

Gehe zunächst zum leuchtenden X innerhalb der kleinen Überwachungsstation und wende dich dem Computerterminal zu. Die Station überwacht den Wasserdruck und die Bodenbedingungen des nahegelegenen Geländes, das für den Anbau von Nutzpflanzen erschlossen wird. Es gibt eine Konstante namens reading, die Python-Daten enthält, welche von der Station gesammelt wurden.

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

Verlasse die Station und gehe zum goldenen X. Verwende die open()-Funktion, um die Tür zu öffnen und Zugang zum Büro zu erhalten. Gehe zum leuchtenden X vor dem Terminal und deserialisiere die Daten, die du gerade serialisiert hast. Erstelle eine Variable namens output und speichere darin den Wert von marshal.loads() mit der vorherigen Variable data als Argument. Verwende die write()-Funktion und übergebe output als Argument, um auf die serialisierten Daten zuzugreifen, die du von der Überwachungsstation gesammelt hast.

Gehe zum leuchtenden X über dem blauen Teppich im Büro; am Terminal werden wir die Protokolle überprüfen, um festzustellen, welche Art von Serialisierung das Pickle-Modul beim Verarbeiten der Daten verwendet. Setze in der vorgegebenen write()-Funktion die Argumente als pickle.DEFAULT_PROTOCOL und pickle.HIGHEST_PROTOCOL. Dies überprüft, welches das aktuelle Serialisierungsprotokoll ist und welches das neueste verfügbare Protokoll darstellt.

Bewege dich zum dunklen X über dem blauen Teppich. Nachdem wir die Protokolle bestätigt haben, können wir nun die gespeicherten Daten überprüfen. Daten wurden über Monate hinweg gesammelt und in einer Konstante namens samples gespeichert. Erstelle drei Variablen mit den Namen 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 lesbarer ASCII, jedoch nicht sehr effizient, Protokoll 2 ist ein effizienteres Binärformat und Protokoll 5 ist das neueste mit den fortschrittlichsten Funktionen.

Wir werden den Wert von pickle.dumps() speichern und als Argumente die Konstante samples sowie das jeweilige protocol, das der Zahl im Variablennamen entspricht, übergeben. Zum Beispiel für sereal_0 setzen wir das Protokoll als 0, also: 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 in Bezug auf jedes Protokoll ausfällt.

Gehe zum leuchtenden X über dem roten Teppich und wende dich dem Terminal zu. Überschreibe die Variable output und speichere darin den Wert von pickle.loads(), wobei du sereal_5 als Argument setzt, um die bis dahin gesammelten Beispieldaten zu deserialisieren. Verwende die display()-Funktion und rufe dabei die Funktion pprint() mit der Variable output auf, um die Daten anzuzeigen. So: await player.display(pprint(output)). Notiere die Bewertungen für jeden Monat, die im Terminal angezeigt werden, damit du sie später notieren kannst.

Gehe zum dunklen X über dem roten Teppich und wende dich dem Schreibtisch zu. Füge in der vorgegebenen write()-Funktion die Bewertungen hinzu, die du für jeden Monat notiert hast und die zuvor im Terminal angezeigt wurden. Füge sie als Strings mit Anführungszeichen ("") in der korrekten Reihenfolge hinzu, wie sie in der Funktion aufgeführt sind, um das Level abzuschließen.

Codebuch