8.1 Czym jest serializacja
Po tym, jak nauczyłeś się pracować z plikami, zapisywać i czytać dane, nadszedł czas, aby nauczyć się poważnie pracować z plikami. Dzisiaj zaczniemy uczyć się o serializacji.
Serializacja to proces przekształcania obiektu w sekwencję bajtów lub format, który można zapisać do pliku, przesłać przez sieć, lub zapisać w bazie danych. Deserializacja to proces odwrotny, który z tej sekwencji bajtów odtwarza oryginalny obiekt.
Aby zapisać obiekt w pliku (lub przesłać go przez sieć), trzeba przekształcić go w jakiś ciąg (lub zestaw bajtów), który będzie łatwo zapisać do pliku (i odczytać z pliku) lub przesłać przez sieć.
Oto 4 główne kierunki, w których używa się serializacji:
- Zapisywanie stanu obiektów: aby zapisać stan obiektu między uruchomieniami programu.
- Przesyłanie danych: aby przesyłać obiekty przez sieć między różnymi komponentami systemu lub między różnymi systemami.
- Cache'owanie: aby zapisać obiekty w cache'u na szybki dostęp.
- Bazy danych: aby przechowywać skomplikowane struktury danych w bazach danych.
Bibliotek zajmujących się serializacją jest bardzo dużo i każda stworzona na swoje potrzeby. Przyjrzymy się pięciu z nich, a z dwoma to znajomość będzie bardzo szczegółowa.
Przeanalizujemy najbardziej popularne z nich:
- Moduł
pickle
- Moduł
json
- Moduł
yaml
- Moduł
marshal
- Moduł
shelve
Niżej będzie krótki przegląd każdego z nich:
8.2 Moduł pickle
pickle
to wbudowany moduł do serializacji i deserializacji obiektów Pythona. Pozwala zapisywać i odtwarzać prawie dowolne obiekty Pythona, w tym klasy użytkownika.
Przykład użycia pickle
:
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)
8.3 Moduł json
json
to wbudowany moduł do pracy z JSON (JavaScript Object Notation). JSON to tekstowy format, który jest używany do wymiany danych między klientem a serwerem.
Przykład użycia json
:
import json
# Przykład obiektu do serializacji
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# Serializacja obiektu do ciągu JSON
json_string = json.dumps(data)
print(json_string)
# Serializacja obiektu do pliku JSON
with open('data.json', 'w') as file:
json.dump(data, file)
# Deserializacja obiektu z ciągu JSON
loaded_data = json.loads(json_string)
print(loaded_data)
# Deserializacja obiektu z pliku JSON
with open('data.json', 'r') as file:
loaded_data = json.load(file)
print(loaded_data)
8.4 Moduł yaml
yaml
(YAML Ain't Markup Language) to czytelny dla człowieka format serializacji danych. Do pracy z YAML w Pythonie używa się zewnętrznej biblioteki PyYAML.
Przykład użycia yaml
:
import yaml
# Przykład obiektu do serializacji
data = {'name': 'Carol', 'age': 27, 'is_student': False}
# Serializacja obiektu do ciągu YAML
yaml_string = yaml.dump(data)
print(yaml_string)
# Serializacja obiektu do pliku YAML
with open('data.yaml', 'w') as file:
yaml.dump(data, file)
# Deserializacja obiektu z ciągu YAML
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
# Deserializacja obiektu z pliku YAML
with open('data.yaml', 'r') as file:
loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)
8.5 Moduł marshal
marshal
to wbudowany moduł do serializacji obiektów Pythona, który jest używany do serializacji kodu Pythona. Jest szybszy niż pickle
, ale obsługuje mniej typów obiektów i nie jest tak elastyczny.
Przykład użycia marshal
:
import marshal
# Przykład obiektu do serializacji
data = {'name': 'Dave', 'age': 35, 'is_student': True}
# Serializacja obiektu do pliku
with open('data.marshal', 'wb') as file:
marshal.dump(data, file)
# Deserializacja obiektu z pliku
with open('data.marshal', 'rb') as file:
loaded_data = marshal.load(file)
print(loaded_data)
8.6 Moduł shelve
shelve
to wbudowany moduł, który zapewnia prostą możliwość zapisywania obiektów Pythona do plików z użyciem magazynu opartego na kluczach, podobnego do słownika.
Przykład użycia shelve
:
import shelve
# Przykład obiektu do serializacji
data = {'name': 'Eve', 'age': 28, 'is_student': False}
# Serializacja obiektu do pliku
with shelve.open('data.shelve') as db:
db['person'] = data
# Deserializacja obiektu z pliku
with shelve.open('data.shelve') as db:
loaded_data = db['person']
print(loaded_data)
I choć same moduły i format zapisu danych różnią się, praca z nimi z punktu widzenia programisty jest bardzo podobna. Poniżej bardziej szczegółowo omówimy pracę z modułem pickle
i modułem json
.
GO TO FULL VERSION