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!

results matching ""

    No results matching ""