Python Language
Serializacja danych pikle
Szukaj…
Składnia
pickle.dump (obiekt, plik, protokół) # Aby serializować obiekt
pickle.load (plik) #Dezserializacji obiektu
pickle.dumps (obiekt, protokół) # Aby serializować obiekt do bajtów
pickle.loads (bufor) # Aby usunąć szereg z obiektu z bajtów
Parametry
Parametr | Detale |
---|---|
obiekt | Obiekt, który ma być przechowywany |
plik | Otwarty plik, który będzie zawierał obiekt |
protokół | Protokół używany do wytrawiania obiektu (parametr opcjonalny) |
bufor | Obiekt bajtów zawierający obiekt zserializowany |
Uwagi
Rodzaje do wyboru
Dostępne są następujące obiekty.
-
None
,True
iFalse
- liczby (wszystkich typów)
- ciągi (wszystkich typów)
-
tuple
s,list
s,set
s, adict
s zawierający tylko picklable przedmiotów - funkcje zdefiniowane na najwyższym poziomie modułu
- wbudowane funkcje
- klasy zdefiniowane na najwyższym poziomie modułu
- instancje takich klas, których
__dict__
lub wynik wywołania__getstate__()
jest możliwy do pobrania (szczegóły w oficjalnych dokumentach ).
- instancje takich klas, których
Na podstawie oficjalnej dokumentacji Pythona .
pickle
i bezpieczeństwo
Moduł zalewania nie jest bezpieczny . Nie należy go używać podczas odbierania serializowanych danych od niezaufanego podmiotu, na przykład przez Internet.
Użycie Pickle do serializacji i deserializacji obiektu
Moduł pickle
implementuje algorytm przekształcania dowolnego obiektu Python w serię bajtów. Ten proces jest również nazywany serializacją obiektu. Strumień bajtów reprezentujący obiekt może być następnie przesłany lub zapisany, a następnie zrekonstruowany w celu utworzenia nowego obiektu o takich samych właściwościach.
Dla najprostszego kodu używamy funkcji dump()
i load()
.
Aby serializować obiekt
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)
Aby deserializować obiekt
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)
Używanie obiektów marynowanych i bajtowych
Możliwe jest również przekształcenie do postaci szeregowej i przekształcenie z postaci szeregowej obiektów bajtowych przy użyciu funkcji dumps
i loads
, które są równoważne dump
i load
.
serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes
deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data
Dostosuj marynowane dane
Niektórych danych nie można marynować. Inne dane nie powinny być marynowane z innych powodów.
To, co zostanie wytrawione, można zdefiniować w metodzie __getstate__
. Ta metoda musi zwrócić coś, co można wybrać.
Po przeciwnej stronie znajduje się __setstate__
: otrzyma to, co __getstate__
utworzyło i musi zainicjować obiekt.
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
Teraz można to zrobić:
>>> 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
Implementacja tutaj tworzy listę o jednej wartości: [self.important_data]
. To był tylko przykład: __getstate__
mógł zwrócić wszystko, co można odebrać, o ile __setstate__
wie, jak zrobić oppoisite. Dobrą alternatywą jest słownik wszystkich wartości: {'important_data': self.important_data}
.
Konstruktor nie jest nazywany! Zauważ, że w poprzednim przykładzie instancja a2
została utworzona w pickle.loads
bez wywoływania A.__init__
, więc A.__setstate__
musiał zainicjować wszystko, co __init__
zainicjowałby, gdyby został wywołany.