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 i False
  • liczby (wszystkich typów)
  • ciągi (wszystkich typów)
  • tuple s, list s, set s, a dict 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 ).

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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow