9.1 Introduzione a pickle
Il modulo pickle permette di salvare praticamente qualsiasi oggetto Python in un file o una stringa, e poi ripristinarlo al suo stato originale. pickle supporta molti tipi di dati, inclusi oggetti personalizzati di classi, e automatizza il processo di conversione degli oggetti in formato byte e viceversa.
Funzioni principali del modulo pickle
- Lettura e scrittura di un oggetto in un file
-
pickle.dump(obj, file): Serializza l'oggettoobje lo scrive nel file apertofile. -
pickle.load(file): Legge dal filefilee deserializza l'oggetto.
-
- Lettura e scrittura di un oggetto in un array di byte
-
pickle.dumps(obj): Serializza l'oggettoobje lo restituisce come oggetto byte. -
pickle.loads(bytes): Deserializza l'oggetto dall'oggetto byte.
-
Li esamineremo più dettagliatamente qui sotto:
9.2 Serializzazione in un file
I passi fondamentali per la serializzazione in un file:
- Apertura del file in modalità scrittura byte
(wb). - Serializzazione dell'oggetto utilizzando
pickle.dump(obj, file). - Per deserializzare l'oggetto utilizziamo
pickle.load(file). - Chiusura del file.
Serializzazione e deserializzazione di un oggetto in un file
In pratica a pickle non importa cosa serializzare. Per esempio, così appare la serializzazione di una lista:
import pickle
data = [1, 2, 3, 4, 5]
# Serializzazione di una lista in un file
with open('list.pkl', 'wb') as file:
pickle.dump(data, file)
# Deserializzazione di una lista da un file
with open('list.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Output: [1, 2, 3, 4, 5]
Ecco come appare la serializzazione di un oggetto dizionario:
import pickle
# Esempio di oggetto per la serializzazione
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# Serializzazione di un oggetto in un file
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# Deserializzazione di un oggetto da un file
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Output: {'name': 'Alice', 'age': 30, 'is_student': False}
Vuoi salvare un oggetto? Chiama dump(), vuoi caricarlo? Chiama load(). Niente di complicato.
9.3 Serializzazione in una stringa
Spesso è necessario trasmettere oggetti attraverso la rete, quindi bisogna salvarli non in un file, ma in una stringa. Per questo pickle ha i metodi dumps e loads con una s in più alla fine.
Azioni fondamentali per la serializzazione e deserializzazione in una stringa (o array di byte):
- Serializzazione di un oggetto utilizzando
pickle.dumps(obj). - Per deserializzare l'oggetto utilizziamo
pickle.loads(data).
Serializzazione e deserializzazione di un oggetto in una stringa
La serializzazione di un oggetto in una stringa (o array di byte) è ancora più semplice: ti basta chiamare un metodo — dumps().
Esempio:
import pickle
# Esempio di oggetto per la serializzazione
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# Serializzazione di un oggetto in una stringa
serialized_data = pickle.dumps(data)
print(serialized_data)
# Deserializzazione di un oggetto da una stringa
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # Output: {'name': 'Bob', 'age': 25, 'is_student': True}
9.4 Errori nella serializzazione
A volte possono verificarsi errori durante la serializzazione. In tal caso, il modulo pickle solleverà eccezioni:
-
pickle.PicklingError— errore durante la serializzazione. -
pickle.UnpicklingError— errore durante la deserializzazione.
Esempi:
import pickle
data = {'key': 'value'}
try:
# Serializzazione di un oggetto in un file
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
except pickle.PicklingError as e:
print(f"Errore di serializzazione: {e}")
try:
# Deserializzazione di un oggetto da un file
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
except pickle.UnpicklingError as e:
print(f"Errore di deserializzazione: {e}")
Di solito, come programmatore, non puoi fare molto con un errore di serializzazione/deserializzazione durante l'esecuzione del programma. Tutto quello che puoi fare è salvare l'errore nel log per capire in futuro perché è successo.
La ragione principale di questi errori è il cambiamento del formato dell'oggetto. Hai salvato un oggetto in un file, poi il tuo programma è stato aggiornato, e l'oggetto ha ottenuto nuovi campi o ha perso quelli vecchi. E ora il vecchio oggetto salvato viene caricato in una classe di un nuovo oggetto...
Questo accade spesso quando si lavora con la rete — il programma versione 2.18 invia un oggetto leggermente diverso da quello che si aspetta il programma versione 3.1. Questo si chiama problema di migrazione, ed è molto comune nei progetti longevi e importanti.
GO TO FULL VERSION