Python Language
Datenserialisierung von Pickles
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
undFalse
- Zahlen (aller Art)
- Saiten (aller Art)
-
tuple
s,list
s,set
s unddict
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 ).
- Instanzen solcher Klassen, deren
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.