CodeGym /Java Kurs /Python SELF DE /Arbeiten mit pickle

Arbeiten mit pickle

Python SELF DE
Level 22 , Lektion 1
Verfügbar

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 Objekt obj und schreibt es in die geöffnete Datei file.
    • pickle.load(file): Liest aus der Datei file und deserialisiert das Objekt.
  • Lesen und Schreiben eines Objekts in einen Byte-Array
    • pickle.dumps(obj): Serialisiert das Objekt obj 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:

  1. Öffnen der Datei im Schreibmodus für Bytes (wb).
  2. Serialisierung des Objekts mit pickle.dump(obj, file).
  3. Um ein Objekt zu deserialisieren, verwenden wir pickle.load(file).
  4. 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.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION