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.

Managed Nextcloud by IONOS Cloud
Teamarbeit in der eigenen Cloud
  • 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']
python

Anschließ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)
python

Das 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)
python

Dadurch erhalten wir die folgende Ausgabe:

['Blau', 'Rot', 'Gelb', 'Orange']
python

Dictionary 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"
	}
}
python

Im 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)
python

Die 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"}
}
python

Auf 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."
)
python

So sieht unser Output aus:

Der Name der dritten Person ist Lisa und sie ist 22 Jahre alt.
python

Eine 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")
python

Nachdem 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}
python

Serialisierte 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)
python

Sicherheitshinweis 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!

Tipp

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!

War dieser Artikel hilfreich?
Page top