Serializzazione e deserializzazione dati con Pickle
Serializzazione e deserializzazione
Per serializzazione si intende un procedimento attraverso il quale dati di qualsiasi tipo presenti in memoria vengono rappresentati in una sequenza di byte che può essere poi salvata in un file per poter essere recuperata successivamente (con l'operazione inversa, detta deserializzazione).
Possono essere serializzati valori semplici, ma anche istanze complete di classi, come si può vedere in questi due esempi, in cui per la serializzazione è stato usato il modulo pickle
.
Semplice lista
import pickle
data=('foo', 'bar', 'baz')
f = open('mydata', 'wb')
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
f.close()
data=()
f = open('mydata', 'rb')
data = pickle.load(f)
f.close()
print(data)
Output:
('foo', 'bar', 'baz')
Oggetto complesso
In questo esempio vediamo come la serializzazione possa operare su una tupla che contiene al suo interno una tupla di istanze della classe Foo, una lista e un dizionario:
class Foo():
def __init__(self, name):
self.name = name
def __str__(self):
return 'Foo «%s»' % self.name
data = (
Foo('abc'), Foo('def'), Foo('ghi'),
['uno', 'due', 'tre'],
{'a': 'primo', 'b': 'secondo', 'c': 'terzo'}
)
f = open('mydata', 'wb')
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
f.close()
data=()
f = open('mydata', 'rb')
data = pickle.load(f)
f.close()
print(data)
print(data[0])
Output:
(<__main__.Foo object at 0xac8a98c>, <__main__.Foo object at 0xac0ceac>, <__main__.Foo object at 0xac86d4c>, ['uno', 'due', 'tre'], {'a': 'primo', 'c': 'terzo', 'b': 'secondo'})
Foo «abc»
Uso dei contesti per la gestione del file
Come per i file di testo, è possibile usare la parola chiave with
per aprire un contesto:
import pickle
data=('foo', 'bar', 'baz')
with open('mydata', 'wb') as f:
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
data=()
with open('mydata', 'rb') as f:
data = pickle.load(f)
print(data)
Nota sulla sicurezza
Quando si caricano i dati memorizzati in un pickle, si deve tenere presente che in esso potrebbero essere memorizzate anche funzioni da richiamare. Ciò comporta un rischio: mai caricare dati da un pickle di fonte non fidata!