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 obiektobji zapisuje go do otwartego plikufile. -
pickle.load(file): Odczytuje z plikufilei deserializuje obiekt.
-
- Odczyt i zapis obiektu do tablicy bajtów
-
pickle.dumps(obj): Serializuje obiektobji 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