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 obiektobj
i zapisuje go do otwartego plikufile
. -
pickle.load(file)
: Odczytuje z plikufile
i deserializuje obiekt.
-
- Odczyt i zapis obiektu do tablicy bajtów
-
pickle.dumps(obj)
: Serializuje obiektobj
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:
- Otwarcie pliku w trybie zapisu bajtowego
(wb)
. - Serializacja obiektu przy użyciu
pickle.dump(obj, file)
. - Do deserializacji obiektu używamy
pickle.load(file)
. - 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.
GO TO FULL VERSION