Mit Python pickle ist es möglich, Objekte zu se­ria­li­sie­ren und später zu de­se­ria­li­sie­ren. Zahl­rei­che Da­ten­ty­pen kommen für die Kon­ver­tie­rung in Frage. Da al­ler­dings auch schad­haf­ter Code in einer Spei­cher­da­tei hin­ter­legt werden kann, sollten Sie aus­schließ­lich Dateien von ver­trau­ens­wür­di­gen Quellen in das ur­sprüng­li­che Format umwandeln.

Was ist Python pickle?

Python pickle (dt. einlegen) mag einen un­ge­wöhn­li­chen Namen haben. Bei einem näheren Blick auf die Funk­ti­ons­wei­se und den Ein­satz­zweck des Moduls versteht man den Hin­ter­grund 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 spei­cher­fä­hi­ges Format kon­ver­tiert. Diese Praktik nennt man Se­ria­li­sie­ren. Python pickle kann außerdem dazu genutzt werden, Objekte zu de­se­ria­li­sie­ren, sie also zurück in ihr ur­sprüng­li­ches Format zu kon­ver­tie­ren. Gerade wenn Sie Objekte öfter verwenden möchten, hilft Python pickle enorm.

Das Objekt wird dabei in einen Bytestream um­ge­wan­delt, wobei sämtliche In­for­ma­tio­nen un­ver­än­dert über­nom­men werden. So können Sie am Ende sicher sein, dass das Objekt nach der Kon­ver­tie­rung zurück ins ur­sprüng­li­che Format auch nahtlos wei­ter­ver­wen­det werden kann. Zu­sätz­lich stellt Python pickle An­wei­sun­gen für eine er­folg­rei­che De­se­ria­li­sie­rung bereit, durch die die ur­sprüng­li­che Struktur bis ins kleinste Detail re­kon­stru­iert werden kann. Der Einsatz von Python pickle bringt eine große Zeit­er­spar­nis mit sich, da einmal angelegte Objekte nicht für jeden Einsatz neu erstellt werden müssen. Das Format für die Spei­che­rung ist .pkl.

Managed Nextcloud by IONOS Cloud
Team­ar­beit in der eigenen Cloud
  • Voll­stän­di­ge Da­ten­sou­ve­rä­ni­tät in deutschen Re­chen­zen­tren
  • Managed Service ohne Ad­mi­nis­tra­ti­ons­auf­wand
  • File-Sharing, Do­ku­men­ten­be­ar­bei­tung & Kom­mu­ni­ka­ti­on

Welche Da­ten­ty­pen können kon­ver­tiert werden?

Python pickle kann folgende Da­ten­ty­pen se­ria­li­sie­ren:

  • Boolesche Werte: „true“ und „false“, außerdem „none“
  • Integer und komplexe Zahlen
  • Strings (normal und Unicode)
  • Listen
  • Sets
  • Python-Tuples
  • Ver­zeich­nis­se, die aus­schließ­lich aus ent­spre­chen­den Objekten bestehen
  • Funk­tio­nen
  • Python-Klassen

Welche un­ter­schied­li­chen Methoden gibt es?

Für die Arbeit mit Python pickle gibt es vier Methoden, die innerhalb des Moduls be­reit­ge­stellt werden:

  • pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None): Wird für die Se­ria­li­sie­rung genutzt und erstellt eine Datei mit dem ge­wünsch­ten Ergebnis
  • pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None): Wird ebenfalls für die Se­ria­li­sie­rung verwendet, gibt al­ler­dings einen Byte-String zurück
  • pickle.load(file, *, fix_imports=True, encoding='ASCII', errors="strict", buffers=None): Wird zur De­se­ria­li­sie­rung verwendet und liest dafür die ge­spei­cher­te Datei aus
  • pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None): Wird ebenfalls zur De­se­ria­li­sie­rung genutzt, operiert aber mit einem Byte-String

Um die Methoden aus­ein­an­der­zu­hal­ten, 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 Funk­ti­ons­wei­se von Python pickle besser zu ver­an­schau­li­chen, 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

An­schlie­ß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 ent­hal­te­nen Daten als Bytes-Objekt aus­ge­ge­ben. Mit dump() wird danach die Liste „farben“ in dieser Datei ge­spei­chert. Ab­schlie­ßend wird die Datei au­to­ma­tisch ge­schlos­sen.

Spei­cher­da­tei in das ur­sprüng­li­che Format umwandeln

Möchten Die nun eine binäre Datei wieder de­se­ria­li­sie­ren, nutzen Sie dafür die Python-Methode pickle.load(). Mit dem folgenden Code wandeln wir das Objekt in sein ur­sprüng­li­ches Format zurück und in­iti­ie­ren 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

Dic­tion­a­ry mit Python pickle se­ria­li­sie­ren

Auch kom­ple­xe­re Da­ten­ty­pen wie Ver­zeich­nis­se können Sie mit Python pickle pro­blem­los se­ria­li­sie­ren und dann zurück in ihre ur­sprüng­li­che Form umwandeln. Dafür erstellen wir zunächst ein Ver­zeich­nis mit dem Namen „personen“. Hier hin­ter­le­gen wir einige un­ter­schied­li­che Daten zu ver­schie­de­nen 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, kon­ver­tie­ren die Daten und wandeln sie dann wieder testweise zurück, um dieses Ver­zeich­nis zu se­ria­li­sie­ren:

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 In­for­ma­tio­nen können Sie nun wie gewohnt zugreifen. Bei­spiel­haft fordern wir die folgende Ausgabe an:

# Dictionary definieren
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 kon­ver­tie­ren

Im nächsten Beispiel speichern wir mithilfe von Python pickle eine Klasse in einem String. Diese Klasse enthält völlig ver­schie­de­ne Da­ten­ty­pen, die al­ler­dings alle be­rück­sich­tigt werden können. Wir erstellen dafür eine Klasse namens „Bei­spiel­Klas­se“ und se­ria­li­sie­ren 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 se­ria­li­siert und danach wieder in ihr ur­sprüng­li­ches Format kon­ver­tiert 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

Se­ria­li­sier­te Objekte kom­pri­mie­ren

Grund­sätz­lich sind Dateien, die mit Python pickle ge­spei­chert werden, ver­gleichs­wei­se kompakt. Trotzdem ist es auch möglich und in manchen Fällen emp­feh­lens­wert, die Spei­cher­da­tei­en noch stärker zu kom­pri­mie­ren. Das funk­tio­niert zum Beispiel mit dem freien Kom­pri­mie­rungs­pro­gramm bzip2, das zur Stan­dard­bi­blio­thek der Pro­gram­mier­spra­che gehört. Im folgenden Beispiel erstellen wir einen String, se­ria­li­sie­ren ihn und wenden dann das Kom­pri­mie­rungs­pro­gramm 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

Si­cher­heits­hin­weis zur Arbeit mit Python pickle

Auch wenn Python pickle eine prak­ti­sche und effektive Methode ist, um Objekte zu kon­ver­tie­ren, gibt es einen ent­schei­den­den Nachteil, den Sie bei der Arbeit mit dem Modul beachten sollten: Es besteht die Mög­lich­keit, über se­ria­li­sier­te Daten schad­haf­ten Code zu trans­por­tie­ren. Das ist bei Ihren eigenen Daten zwar kein Problem – es gilt jedoch Vorsicht bei fremden Dateien. De­se­ria­li­sie­ren Sie daher immer nur Spei­cher­da­tei­en, deren Quelle Sie kennen und vertrauen!

Tipp

De­ploy­ment direkt via GitHub: Mit Deploy Now von IONOS pro­fi­tie­ren Sie nicht nur von au­to­ma­ti­scher Framework-Erkennung und einem schnellen Setup, sondern haben auch die Wahl zwischen ver­schie­de­nen Ta­rif­ty­pen. Finden Sie die Lösung, die perfekt zu Ihren An­sprü­chen passt!

Zum Hauptmenü