Python pickle: So serialisieren Sie Objekte in der Programmiersprache
Mit Python pickle
ist es möglich, Objekte zu serialisieren und später zu deserialisieren. Zahlreiche Datentypen kommen für die Konvertierung in Frage. Da allerdings auch schadhafter Code in einer Speicherdatei hinterlegt werden kann, sollten Sie ausschließlich Dateien von vertrauenswürdigen Quellen in das ursprüngliche Format umwandeln.
Was ist Python pickle
?
Python pickle
(dt. einlegen) mag einen ungewöhnlichen Namen haben. Bei einem näheren Blick auf die Funktionsweise und den Einsatzzweck des Moduls versteht man den Hintergrund dieses Namens aber sehr schnell. Das Modul erlaubt es Ihnen nämlich, Objekte zu speichern, um sie zu einem späteren Zeitpunkt zu verwenden, zu teilen oder sie für ein anderes Projekt zu nutzen. Dafür werden die Objekte in ein speicherfähiges Format konvertiert. Diese Praktik nennt man Serialisieren. Python pickle
kann außerdem dazu genutzt werden, Objekte zu deserialisieren, sie also zurück in ihr ursprüngliches Format zu konvertieren. Gerade wenn Sie Objekte öfter verwenden möchten, hilft Python pickle
enorm.
Das Objekt wird dabei in einen Bytestream umgewandelt, wobei sämtliche Informationen unverändert übernommen werden. So können Sie am Ende sicher sein, dass das Objekt nach der Konvertierung zurück ins ursprüngliche Format auch nahtlos weiterverwendet werden kann. Zusätzlich stellt Python pickle
Anweisungen für eine erfolgreiche Deserialisierung bereit, durch die die ursprüngliche Struktur bis ins kleinste Detail rekonstruiert werden kann. Der Einsatz von Python pickle
bringt eine große Zeitersparnis mit sich, da einmal angelegte Objekte nicht für jeden Einsatz neu erstellt werden müssen. Das Format für die Speicherung ist .pkl.
- Vollständige Datensouveränität in deutschen Rechenzentren
- Managed Service ohne Administrationsaufwand
- File-Sharing, Dokumentenbearbeitung & Kommunikation
Welche Datentypen können konvertiert werden?
Python pickle
kann folgende Datentypen serialisieren:
- Boolesche Werte: „true“ und „false“, außerdem „none“
- Integer und komplexe Zahlen
- Strings (normal und Unicode)
- Listen
- Sets
- Python-Tuples
- Verzeichnisse, die ausschließlich aus entsprechenden Objekten bestehen
- Funktionen
- Python-Klassen
Welche unterschiedlichen Methoden gibt es?
Für die Arbeit mit Python pickle
gibt es vier Methoden, die innerhalb des Moduls bereitgestellt werden:
-
pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)
: Wird für die Serialisierung genutzt und erstellt eine Datei mit dem gewünschten Ergebnis -
pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)
: Wird ebenfalls für die Serialisierung verwendet, gibt allerdings einen Byte-String zurück -
pickle.load(file, *, fix_imports=True, encoding='ASCII', errors="strict", buffers=None)
: Wird zur Deserialisierung verwendet und liest dafür die gespeicherte Datei aus -
pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)
: Wird ebenfalls zur Deserialisierung genutzt, operiert aber mit einem Byte-String
Um die Methoden auseinanderzuhalten, können Sie sich merken, dass das „s“ in pickle.dumps
und pickle.loads
für „String“ steht.
Beispiel für Python pickle
Um die Funktionsweise von Python pickle
besser zu veranschaulichen, arbeiten wir mit einem einfachen Beispiel. Dafür erstellen wir eine einfache Liste, die vier Farben enthält. Dies ist unser Code:
import pickle
farben = ['Blau', 'Rot', 'Gelb', 'Orange']
pythonAnschließend öffnen wir eine Textdatei im Format .pkl und nutzen pickle.dump()
, um unsere Liste dort zu speichern. Dafür verwenden wir diesen Code:
with open('farben_datei.pkl', 'wb') as f:
pickle.dump(farben, f)
pythonDas Kürzel wb
weist das System an, die Datei in binärer Form zu öffnen. Dadurch werden auch die enthaltenen Daten als Bytes-Objekt ausgegeben. Mit dump()
wird danach die Liste „farben“ in dieser Datei gespeichert. Abschließend wird die Datei automatisch geschlossen.
Speicherdatei in das ursprüngliche Format umwandeln
Möchten Die nun eine binäre Datei wieder deserialisieren, nutzen Sie dafür die Python-Methode pickle.load()
. Mit dem folgenden Code wandeln wir das Objekt in sein ursprüngliches Format zurück und initiieren eine Ausgabe. Dabei fügen wir das Kürzel rb
ein, das für „read binary“ steht.
with open('farben_datei.pkl', 'rb') as f:
farben_deserialisiert = pickle.load(f)
print(farben_deserialisiert)
pythonDadurch erhalten wir die folgende Ausgabe:
['Blau', 'Rot', 'Gelb', 'Orange']
pythonDictionary mit Python pickle
serialisieren
Auch komplexere Datentypen wie Verzeichnisse können Sie mit Python pickle
problemlos serialisieren und dann zurück in ihre ursprüngliche Form umwandeln. Dafür erstellen wir zunächst ein Verzeichnis mit dem Namen „personen“. Hier hinterlegen wir einige unterschiedliche Daten zu verschiedenen Personen:
import pickle
personen = {
'Person 1': {
'Name': "Maria", 'Alter': 56, 'Stadt': "Berlin"
},
'Person 2': {
'Name': "Paul", 'Alter': 66, 'Stadt': "Berlin"
},
'Person 3': {
'Name': "Lisa", 'Alter': 22, 'Stadt': "Hamburg"
},
'Person 4': {
'Name': "Lara", 'Alter': 34, 'Stadt': "Dresden"
}
}
pythonIm folgenden Code legen wir daher eine neue Datei an, konvertieren die Daten und wandeln sie dann wieder testweise zurück, um dieses Verzeichnis zu serialisieren:
with open("personen_dict.pkl", "wb") as f:
pickle.dump(personen, f)
with open("personen_dict.pkl", "rb") as f:
deserialisiertes_dict = pickle.load(f)
print(deserialisiertes_dict)
pythonDie erhaltene Ausgabe sieht dann so aus:
personen = {
'Person 1': { 'Name': "Maria", 'Alter': 56, 'Stadt': "Berlin"},
'Person 2': { 'Name': "Paul", 'Alter': 66, 'Stadt': "Berlin"},
'Person 3': { 'Name': "Lisa", 'Alter': 22, 'Stadt': "Hamburg"},
'Person 4': { 'Name': "Lara", 'Alter': 34, 'Stadt': "Dresden"}
}
pythonAuf die Informationen können Sie nun wie gewohnt zugreifen. Beispielhaft fordern wir die folgende Ausgabe an:
deserialisiertes_dict = {
'Person 1': {'Name': "Maria", 'Alter': 56, 'Stadt': "Berlin"},
'Person 2': {'Name': "Paul", 'Alter': 66, 'Stadt': "Berlin"},
'Person 3': {'Name': "Lisa", 'Alter': 22, 'Stadt': "Hamburg"},
'Person 4': {'Name': "Lara", 'Alter': 34, 'Stadt': "Dresden"}
}
# Ausgabe drucken
print(
"Der Name der dritten Person ist "
+ deserialisiertes_dict["Person 3"]["Name"]
+ " und sie ist "
+ str(deserialisiertes_dict["Person 3"]["Alter"])
+ " Jahre alt."
)
pythonSo sieht unser Output aus:
Der Name der dritten Person ist Lisa und sie ist 22 Jahre alt.
pythonEine Klasse in einen String konvertieren
Im nächsten Beispiel speichern wir mithilfe von Python pickle
eine Klasse in einem String. Diese Klasse enthält völlig verschiedene Datentypen, die allerdings alle berücksichtigt werden können. Wir erstellen dafür eine Klasse namens „BeispielKlasse“ und serialisieren diese im Anschluss. Der dazu passende Code:
import pickle
class BeispielKlasse:
def __init__(self):
self.a_number = 17
self.a_list = [5, 10, 15]
self.a_tuple = (18, 19)
self.a_string = "hallo"
self.a_dict = {"farbe": "blau", "zahl": 3}
beispiel_objekt = BeispielKlasse()
serialisiertes_objekt = pickle.dumps(beispiel_objekt)
print(f"Dies ist das serialisierte Objekt:\n{serialisiertes_objekt}\n")
beispiel_objekt.a_dict = None
deserialisiertes_objekt = pickle.loads(serialisiertes_objekt)
print(f"Dies ist a_dict aus dem deserialisierten Objekt:\n{deserialisiertes_objekt.a_dict}\n")
pythonNachdem wir die Klasse serialisiert und danach wieder in ihr ursprüngliches Format konvertiert haben, erhalten wir diese Ausgabe:
Dies ist das serialisierte Objekt:
b'\x80\x03c__main__\nBeispielKlasse\nq\x00)\x81q\x01.'
Dies ist a_dict aus dem deserialisierten Objekt:
{'farbe': 'blau', 'zahl': 3}
pythonSerialisierte Objekte komprimieren
Grundsätzlich sind Dateien, die mit Python pickle
gespeichert werden, vergleichsweise kompakt. Trotzdem ist es auch möglich und in manchen Fällen empfehlenswert, die Speicherdateien noch stärker zu komprimieren. Das funktioniert zum Beispiel mit dem freien Komprimierungsprogramm bzip2, das zur Standardbibliothek der Programmiersprache gehört. Im folgenden Beispiel erstellen wir einen String, serialisieren ihn und wenden dann das Komprimierungsprogramm an:
import pickle
import bz2
beispielstring = """Almost heaven, West Virginia
Blue Ridge Mountains, Shenandoah River
Life is old there, older than the trees
Younger than the mountains, growin' like a breeze
Country roads, take me home
To the place I belong
West Virginia, mountain mama
Take me home, country roads."""
serialisiert = pickle.dumps(beispielstring)
komprimiert = bz2.compress(serialisiert)
pythonSicherheitshinweis zur Arbeit mit Python pickle
Auch wenn Python pickle
eine praktische und effektive Methode ist, um Objekte zu konvertieren, gibt es einen entscheidenden Nachteil, den Sie bei der Arbeit mit dem Modul beachten sollten: Es besteht die Möglichkeit, über serialisierte Daten schadhaften Code zu transportieren. Das ist bei Ihren eigenen Daten zwar kein Problem – es gilt jedoch Vorsicht bei fremden Dateien. Deserialisieren Sie daher immer nur Speicherdateien, deren Quelle Sie kennen und vertrauen!
Deployment direkt via GitHub: Mit Deploy Now von IONOS profitieren Sie nicht nur von automatischer Framework-Erkennung und einem schnellen Setup, sondern haben auch die Wahl zwischen verschiedenen Tariftypen. Finden Sie die Lösung, die perfekt zu Ihren Ansprüchen passt!