CodeGym /Kursy /Python SELF PL /Praca z pickle

Praca z pickle

Python SELF PL
Poziom 22 , Lekcja 1
Dostępny

9.1 Wprowadzenie do pickle

Moduł pickle pozwala zapisać praktycznie każdy obiekt Pythona do pliku lub stringa, a następnie przywrócić go do pierwotnego stanu. pickle obsługuje wiele typów danych, w tym niestandardowe obiekty klas, i automatyzuje proces przekształcenia obiektów na format bajtowy i odwrotnie.

Podstawowe funkcje modułu pickle

  • Odczyt i zapis obiektu do pliku
    • pickle.dump(obj, file): Serializuje obiekt obj i zapisuje go do otwartego pliku file.
    • pickle.load(file): Odczytuje z pliku file i deserializuje obiekt.
  • Odczyt i zapis obiektu do tablicy bajtów
    • pickle.dumps(obj): Serializuje obiekt obj i zwraca go jako obiekt bajtowy.
    • pickle.loads(bytes): Deserializuje obiekt z obiektu bajtowego.

Poniżej omówimy je nieco bardziej szczegółowo:

9.2 Serializacja do pliku

Podstawowe kroki serializacji do pliku:

  1. Otwarcie pliku w trybie zapisu bajtowego (wb).
  2. Serializacja obiektu przy użyciu pickle.dump(obj, file).
  3. Do deserializacji obiektu używamy pickle.load(file).
  4. Zamknięcie pliku.

Serializacja i deserializacja obiektu do pliku

W zasadzie pickle jest obojętne, co serializować. Na przykład tak wygląda serializacja listy:


import pickle

data = [1, 2, 3, 4, 5]
            
# Serializacja listy do pliku
with open('list.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# Deserializacja listy z pliku
with open('list.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)  # Wyjście: [1, 2, 3, 4, 5]

A oto jak wygląda serializacja obiektu słownika:


import pickle

# Przykład obiektu do serializacji
data = {'name': 'Alice', 'age': 30, 'is_student': False}
            
# Serializacja obiektu do pliku
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# Deserializacja obiektu z pliku
with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)  # Wyjście: {'name': 'Alice', 'age': 30, 'is_student': False}

Chcemy zapisać obiekt — wywołujemy dump(), chcemy załadować — wywołujemy load(). Nic trudnego.

9.3 Serializacja do stringa

Bardzo często obiekty trzeba przesłać przez sieć, więc trzeba je zapisać nie do pliku, ale do stringa. Do tego pickle ma metody dumps i loads z dodatkową s na końcu.

Podstawowe działania dla serializacji i deserializacji do stringa (lub tablicy bajtów):

  • Serializacja obiektu przy użyciu pickle.dumps(obj).
  • Do deserializacji obiektu używamy pickle.loads(data).

Serializacja i deserializacja obiektu do stringa

Serializacja obiektu do stringa (lub zbioru bajtów) jest jeszcze prostsza — wystarczy wywołać jedną metodę — dumps().

Przykład:


import pickle

# Przykład obiektu do serializacji
data = {'name': 'Bob', 'age': 25, 'is_student': True}
            
# Serializacja obiektu do stringa
serialized_data = pickle.dumps(data)
print(serialized_data)
            
# Deserializacja obiektu z stringa
loaded_data = pickle.loads(serialized_data)
print(loaded_data)  # Wyjście: {'name': 'Bob', 'age': 25, 'is_student': True}

9.4 Błędy przy serializacji

Czasami podczas serializacji pojawiają się błędy. W takim przypadku moduł pickle rzuca wyjątkami:

  • pickle.PicklingError — błąd podczas serializacji.
  • pickle.UnpicklingError — błąd podczas deserializacji.

Przykłady:


import pickle

data = {'key': 'value'}
            
try:
    # Serializacja obiektu do pliku
    with open('data.pkl', 'wb') as file:
        pickle.dump(data, file)
except pickle.PicklingError as e:
    print(f"Błąd serializacji: {e}")
            
try:
    # Deserializacja obiektu z pliku
    with open('data.pkl', 'rb') as file:
        loaded_data = pickle.load(file)
    print(loaded_data)
except pickle.UnpicklingError as e:
    print(f"Błąd deserializacji: {e}")

Zwykle jako programista nie możesz nic zrobić z błędem serializacji/deserializacji podczas działania programu. Wszystko, co możesz zrobić — to zapisać ją w logu, aby w przyszłości zrozumieć, dlaczego tak się stało.

Główną przyczyną takich błędów — jest zmiana formatu obiektu. Zapisałeś obiekt do pliku, a potem twoja aplikacja została uaktualniona i obiekt zyskał nowe pola lub stare zniknęły. I teraz stary zapisany obiekt próbuje się załadować do klasy nowego obiektu...

Ponownie, ta sytuacja często pojawia się przy pracy z siecią — aplikacja w wersji 2.18 wysyła nieco inny obiekt, niż oczekuje aplikacja w wersji 3.1. To się nazywa problem migracji, i z tym bardzo często spotyka się w projektach, które długo istnieją i są popularne.

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