9.1 Einführung in pickle
Das Modul pickle
erlaubt es dir, nahezu jedes
Python-Objekt in einer Datei oder einem String zu speichern und später
in seinen ursprünglichen Zustand wiederherzustellen. pickle
unterstützt viele Datentypen, einschließlich benutzerdefinierter Klassenobjekte, und automatisiert den Prozess der
Umwandlung von Objekten in Byte-Format und zurück.
Die Hauptfunktionen des Moduls pickle
-
Lesen und Schreiben eines Objekts in eine Datei
-
pickle.dump(obj, file)
: Serialisiert das Objektobj
und schreibt es in die geöffnete Dateifile
. -
pickle.load(file)
: Liest aus der Dateifile
und deserialisiert das Objekt.
-
-
Lesen und Schreiben eines Objekts in einen Byte-Array
-
pickle.dumps(obj)
: Serialisiert das Objektobj
und gibt es als Byte-Objekt zurück. -
pickle.loads(bytes)
: Deserialisiert ein Objekt aus einem Byte-Objekt.
-
Wir werden sie etwas genauer untersuchen:
9.2 Serialisierung in eine Datei
Die Hauptschritte zur Serialisierung in eine Datei:
-
Öffnen der Datei im Schreibmodus für Bytes
(wb)
. -
Serialisierung des Objekts mit
pickle.dump(obj, file)
. -
Um ein Objekt zu deserialisieren, verwenden wir
pickle.load(file)
. - Schließen der Datei.
Serialisierung und Deserialisierung eines Objekts in eine Datei
Im Grunde ist es pickle
egal, was serialisiert wird. Ein Beispiel für die Serialisierung einer Liste sieht so aus:
import pickle
data = [1, 2, 3, 4, 5]
# Serialisierung einer Liste in eine Datei
with open('list.pkl', 'wb') as file:
pickle.dump(data, file)
# Deserialisierung der Liste aus einer Datei
with open('list.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Ausgabe: [1, 2, 3, 4, 5]
Und so sieht die Serialisierung eines Dictionarys aus:
import pickle
# Beispielobjekt zur Serialisierung
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# Serialisierung des Objekts in eine Datei
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# Deserialisierung des Objekts aus einer Datei
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Ausgabe: {'name': 'Alice', 'age': 30, 'is_student': False}
Möchtest du ein Objekt speichern, rufst du
dump()
auf, möchtest du es laden, rufst du
load()
auf. Ganz einfach.
9.3 Serialisierung in einen String
Oftmals müssen Objekte über das Netzwerk gesendet werden, deshalb sollte ein Objekt nicht in einer Datei, sondern in einem String gespeichert werden. Dafür bietet pickle
die Methoden
dumps
und loads
, jeweils mit einem zusätzlichen
s
am Ende.
Die Hauptaktionen zur Serialisierung und Deserialisierung in einen String (oder einen Byte-Array):
-
Serialisierung des Objekts mit
pickle.dumps(obj)
. -
Zur Deserialisierung des Objekts verwenden wir
pickle.loads(data)
.
Serialisierung und Deserialisierung eines Objekts in einen String
Die Serialisierung eines Objekts in einen String (oder ein Byte-Array) ist noch einfacher — du musst nur eine Methode aufrufen — dumps()
.
Beispiel:
import pickle
# Beispielobjekt zur Serialisierung
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# Serialisierung des Objekts in einen String
serialized_data = pickle.dumps(data)
print(serialized_data)
# Deserialisierung des Objekts aus einem String
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # Ausgabe: {'name': 'Bob', 'age': 25, 'is_student': True}
9.4 Fehler bei der Serialisierung
Manchmal treten beim Serialisieren Fehler auf. In diesem Fall wirft das Modul
pickle
Ausnahmen:
-
pickle.PicklingError
— Fehler während der Serialisierung. -
pickle.UnpicklingError
— Fehler während der Deserialisierung.
Beispiele:
import pickle
data = {'key': 'value'}
try:
# Serialisierung des Objekts in eine Datei
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
except pickle.PicklingError as e:
print(f"Serialisierungsfehler: {e}")
try:
# Deserialisierung des Objekts aus einer Datei
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
except pickle.UnpicklingError as e:
print(f"Deserialisierungsfehler: {e}")
Normalerweise kannst du als Entwickler während der Laufzeit des Programms nicht viel mit einem Serialisierungs-/Deserialisierungsfehler anfangen. Alles, was du tun kannst, ist, es zu protokollieren, um später zu analysieren, warum das passiert ist.
Der Hauptgrund für solche Fehler ist eine Änderung im Format des Objekts. Du hast ein Objekt in einer Datei gespeichert, dann wurde dein Programm aktualisiert und das Objekt hat neue Felder hinzubekommen oder alte verloren. Und nun versucht das alte gespeicherte Objekt, in eine neue Objektklasse geladen zu werden…
Wiederum tritt diese Situation häufig bei der Arbeit mit Netzwerken auf — das Programm Version 2.18 sendet ein etwas anderes Objekt, als das Programm Version 3.1 erwartet. Dies wird Migrationsproblem genannt und damit wird häufig in langlebigen und populären Projekten konfrontiert.
GO TO FULL VERSION