Suche…


Syntax

  • pickle.dump (Objekt, Datei, Protokoll) #So serialisiert ein Objekt

  • pickle.load (file) #Umserialisieren eines Objekts

  • pickle.dumps (object, protocol) # Um ein Objekt in Bytes zu serialisieren

  • pickle.loads (buffer) # Um ein Objekt von Bytes zu trennen

Parameter

Parameter Einzelheiten
Objekt Das Objekt, das gespeichert werden soll
Datei Die geöffnete Datei, die das Objekt enthalten soll
Protokoll Das zum Beizen des Objekts verwendete Protokoll (optionaler Parameter)
Puffer Ein Byte-Objekt, das ein serialisiertes Objekt enthält

Bemerkungen

Pickleable Typen

Die folgenden Objekte sind picklierbar.

  • None , True und False
  • Zahlen (aller Art)
  • Saiten (aller Art)
  • tuple s, list s, set s und dict s , die nur picklable Objekte
  • Funktionen, die auf der obersten Ebene eines Moduls definiert sind
  • eingebaute Funktionen
  • Klassen, die auf der obersten Ebene eines Moduls definiert sind
    • Instanzen solcher Klassen, deren __dict__ oder das Ergebnis des Aufrufs von __getstate__() picklierbar ist (Details finden Sie in den offiziellen Dokumenten ).

Basierend auf der offiziellen Python-Dokumentation .

pickle und Sicherheit

Das Pickle-Modul ist nicht sicher . Es sollte nicht verwendet werden, wenn die serialisierten Daten von einer nicht vertrauenswürdigen Partei, z. B. über das Internet, empfangen werden.

Verwenden von Pickle zum Serialisieren und Deserialisieren eines Objekts

Das pickle Modul implementiert einen Algorithmus zum Umwandeln eines beliebigen Python-Objekts in eine Reihe von Bytes. Dieser Vorgang wird auch als Serialisierung des Objekts bezeichnet. Der das Objekt repräsentierende Byte-Datenstrom kann dann übertragen oder gespeichert und später rekonstruiert werden, um ein neues Objekt mit denselben Eigenschaften zu erstellen.

Für den einfachsten Code verwenden wir die Funktionen dump() und load() .

Das Objekt wird serialisiert

import pickle

# An arbitrary collection of objects supported by pickle.
data = {
    'a': [1, 2.0, 3, 4+6j],
    'b': ("character string", b"byte string"),
    'c': {None, True, False}
}

with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

Das Objekt deserialisieren

import pickle

with open('data.pickle', 'rb') as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)

Pickle- und Byte-Objekte verwenden

Es ist auch möglich , in serialisiert und deserialisiert aus Byte Objekten, die unter Verwendung von dumps und loads - Funktion, die äquivalent ist zu dump und load .

serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes

deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data

Angepasste Daten anpassen

Einige Daten können nicht gebeizt werden. Andere Daten sollten aus anderen Gründen nicht gepickt werden.

Was __getstate__ wird, kann in der __getstate__ Methode definiert werden. Diese Methode muss etwas Pickelbares zurückgeben.

Auf der gegenüberliegenden Seite ist __setstate__ : Er erhält das, was __getstate__ erstellt hat, und muss das Objekt initialisieren.

class A(object):
    def __init__(self, important_data):
        self.important_data = important_data
        
        # Add data which cannot be pickled:
        self.func = lambda: 7
        
        # Add data which should never be pickled, because it expires quickly:
        self.is_up_to_date = False
    
    def __getstate__(self):
        return [self.important_data] # only this is needed
    
    def __setstate__(self, state):
        self.important_data = state[0]
        
        self.func = lambda: 7  # just some hard-coded unpicklable function
        
        self.is_up_to_date = False  # even if it was before pickling

Jetzt kann das gemacht werden:

>>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1)  # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s)  # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7

Die Implementierung hier enthält eine Liste mit einem Wert: [self.important_data] . Das war nur ein Beispiel, __getstate__ hätte alles zurückgeben können, was picklierbar ist, solange __setstate__ weiß, wie die Gegenseite zu tun ist. Eine gute Alternative ist ein Wörterbuch aller Werte: {'important_data': self.important_data} .

Konstruktor wird nicht aufgerufen! Beachten Sie, dass im vorherigen Beispiel a2 in pickle.loads ohne dass A.__init__ A.__setstate__ musste A.__setstate__ alles initialisieren, das __init__ initialisiert hätte, wenn es aufgerufen würde.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow