Con pickle di Python è possibile se­ria­liz­za­re e suc­ces­si­va­men­te de­se­ria­liz­za­re oggetti. La con­ver­sio­ne può essere ef­fet­tua­ta con numerosi tipi di dati. Tuttavia, poiché in un file può essere me­mo­riz­za­to anche del codice maligno, è con­si­glia­bi­le con­ver­ti­re nel formato originale solo i file pro­ve­nien­ti da fonti af­fi­da­bi­li.

Cos’è pickle di Python?

Il nome pickle può suonare insolito, se si pensa che in inglese significa sottaceto. Tuttavia, una volta compreso il fun­zio­na­men­to e lo scopo del modulo, non è difficile capire il perché di questo nome. Python pickle consente infatti di salvare gli oggetti per poterli uti­liz­za­re in un secondo momento, con­di­vi­der­li e usarli per un altro progetto. Per fare ciò, gli oggetti vengono con­ver­ti­ti in un formato salvabile: questa pratica è chiamata se­ria­liz­za­zio­ne. Questo processo può essere usato anche per de­se­ria­liz­za­re gli oggetti, cioè per ri­con­ver­tir­li nel loro formato originale. Python pickle è par­ti­co­lar­men­te utile a chi desidera uti­liz­za­re fre­quen­te­men­te gli oggetti.

L’oggetto viene con­ver­ti­to in un flusso di byte, in cui tutte le in­for­ma­zio­ni vengono tra­sfe­ri­te inal­te­ra­te. Alla fine, l’oggetto può con­ti­nua­re a essere uti­liz­za­to anche dopo la con­ver­sio­ne nel formato originale. Inoltre, Python pickle fornisce istru­zio­ni per una de­se­ria­liz­za­zio­ne efficace, con­sen­ten­do di ri­co­strui­re la struttura originale fin nei minimi dettagli. L’uso di Python pickle fa ri­spar­mia­re molto tempo, poiché gli oggetti creati una volta non devono essere ricreati per ogni utilizzo. Il formato di sal­va­tag­gio è .pkl.

Managed Nextcloud di IONOS Cloud
Lavora con il tuo team sul cloud
  • Massima sicurezza dei tuoi dati
  • Strumenti di col­la­bo­ra­zio­ne per lavorare in team
  • Ag­gior­na­men­ti au­to­ma­ti­ci

Quali tipi di dati possono essere con­ver­ti­ti?

Il modulo pickle è in grado di se­ria­liz­za­re i seguenti tipi di dati in Python:

  • Valori booleani: “true”, “false” e “none”
  • Numeri interi e numeri complessi
  • Stringhe (normali e Unicode)
  • Elenchi
  • Set
  • Tuple
  • Cartelle che con­si­sto­no esclu­si­va­men­te di oggetti cor­ri­spon­den­ti
  • Funzioni
  • Classi

Quali sono i diversi metodi?

Il modulo pickle mette a di­spo­si­zio­ne tre metodi di lavoro:

  • pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None): uti­liz­za­to per la se­ria­liz­za­zio­ne, crea un file con il risultato de­si­de­ra­to;
  • pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None): al­tret­tan­to uti­liz­za­to per la se­ria­liz­za­zio­ne, ma re­sti­tui­sce una stringa di byte;
  • pickle.load(file, *, fix_imports=True, encoding='ASCII', errors="strict", buffers=None): uti­liz­za­to per la de­se­ria­liz­za­zio­ne, legge il file salvato a questo scopo;
  • pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None): al­tret­tan­to uti­liz­za­to per la de­se­ria­liz­za­zio­ne, ma opera con una stringa di byte.

Per di­stin­gue­re i due metodi, basta ricordare che la “s” in pickle.dumps e pickle.loads sta per “stringa”.

Python pickle: esempio di fun­zio­na­men­to

Per il­lu­stra­re meglio il fun­zio­na­men­to di pickle in Python, ci serviremo di un esempio facile. Creeremo una lista semplice con­te­nen­te quattro colori. Il nostro codice è il seguente:

import pickle
colori = ['Blu', 'Rosso', 'Giallo', 'Arancione']
python

Dopodiché apriamo un file di testo nel formato .pkl e usiamo pickle.dump() per salvarvi la nostra lista. A tale scopo uti­liz­zia­mo questo codice:

with open('file_colori.pkl', 'wb') as f:
	pickle.dump(colori, f)
python

L’ab­bre­via­zio­ne wb indica al sistema di aprire il file in forma binaria. In questo modo i dati contenuti vengono vi­sua­liz­za­ti come oggetto byte. L’elenco dei “colori” viene quindi salvato in questo file con dump(). Infine, il file viene chiuso au­to­ma­ti­ca­men­te.

Con­ver­ti­re il file di memoria nel formato originale

Se ora desideri de­se­ria­liz­za­re nuo­va­men­te un file binario, puoi usare il metodo Python pickle.load(). Con il codice seguente, converti l’oggetto nel suo formato originale e avvii un output. Ag­giun­gia­mo l’ab­bre­via­zio­ne rb, che sta per “read binary”.

with open('file_colori.pkl', 'rb') as f:
	colori_deserializzati = pickle.load(f)
	print(colori_deserializzati)
python

Otteniamo così il seguente risultato:

['Blu', 'Rosso', 'Giallo', 'Arancione']
python

Se­ria­liz­za­re il di­zio­na­rio con Python pickle

Con Python pickle è anche possibile se­ria­liz­za­re fa­cil­men­te tipi di dati più complessi, come cartelle (directory), e poi ri­con­ver­tir­li nella loro forma originale. Per fare questo, creiamo prima una cartella con il nome “persone”. Qui me­mo­riz­zia­mo alcuni dati diversi per persone diverse:

import pickle
persone = {
	'Persona 1': {
		'Nome': "Maria", 'Età': 56, 'Città': "Milano"
	},
	'Persona 2': {
		'Nome': "Paolo", 'Età': 66, 'Città': "Milano"
	},
	'Persona 3': {
		'Nome': "Lisa", 'Età': 22, 'Città': "Roma"
	},
	'Persona 4': {
		'Nome': "Lara", 'Età': 34, 'Città': "Bologna"
	}
}
python

Nel codice seguente, quindi, creiamo un nuovo file, con­ver­tia­mo i dati e poi li con­ver­tia­mo di nuovo come test per se­ria­liz­za­re questa cartella:

with open("persone_dict.pkl", "wb") as f:
	pickle.dump(persone, f)
with open("persone_dict.pkl", "rb") as f:
	dict_deserializzato = pickle.load(f)
	print(dict_deserializzato)
python

Il risultato sarà simile a questo:

persone = {
    'Persona 1': { 'Nome': "Maria", 'Età': 56, 'Città': "Milano"},
    'Persona 2': { 'Nome': "Paolo", 'Età': 66, 'Città': "Milano"},
    'Persona 3': { 'Nome': "Lisa", 'Età': 22, 'Città': "Roma"},
    'Persona 4': { 'Nome': "Lara", 'Età': 34, 'Città': "Bologna"}
}
python

Ora è possibile accedere alle in­for­ma­zio­ni come di consueto. Chiediamo il seguente output come esempio:

# Definire il dizionario
dict_deserializzato = {
    'Persona 1': {'Nome': "Maria", 'Età': 56, 'Città': "Milano"},
    'Persona 2': {'Nome': "Paolo", 'Età': 66, 'Città': "Milano"},
    'Persona 3': {'Nome': "Lisa", 'Età': 22, 'Città': "Roma"},
    'Persona 4': {'Nome': "Lara", 'Età': 34, 'Città': "Bologna"}
}
# Stampa l'output
print(
    "La terza persona si chiama "
    + dict_deserializzato["Persona 3"]["Nome"]
    + " e ha "
    + str(dict_deserializzato["Persona 3"]["Età"])
    + " anni."
)
python

L’output si pre­sen­te­rà nel modo seguente:

La terza persona si chiama Lisa e ha 22 anni.
python

Con­ver­ti­re una classe in una stringa

Nel prossimo esempio, uti­liz­zia­mo Python pickle per salvare una classe in una stringa. Questa classe contiene tipi di dati com­ple­ta­men­te diversi, ma che possono tutti essere presi in con­si­de­ra­zio­ne. Creiamo una classe chiamata “Exam­ple­Class” e poi la se­ria­liz­zia­mo. Il codice per fare ciò è il seguente:

import pickle
class EsempioClasse:
	def __init__(self):
		self.a_number = 17
		self.a_list = [5, 10, 15]
		self.a_tuple = (18, 19)
		self.a_string = "hallo"
		self.a_dict = {"colore": "blu", "numero": 3}
oggetto_esempio = EsempioClasse()
oggetto_serializzato = pickle.dumps(oggetto_esempio)
print(f"Questo è l'oggetto serializzato:\n{oggetto_serializzato}\n")
oggetto_esempio.a_dict = None
oggetto_deserializzato = pickle.loads(oggetto_serializzato)
print(f"Questo è un_dict dell'oggetto deserializzato:\n{oggetto_deserializzato.a_dict}\n")
python

Dopo aver se­ria­liz­za­to la classe e averla ri­con­ver­ti­ta nel suo formato originale, otteniamo questo risultato:

Questo è l’oggetto serializzato:
b'\x80\x03c__main__\nEsempioClasse\nq\x00)\x81q\x01.'
Questo è un_dict dell’oggetto deserializzato:
{'colore': 'blu', 'numero': 3}
python

Com­pri­me­re gli oggetti se­ria­liz­za­ti

In linea di principio, i file salvati con Python pickle sono re­la­ti­va­men­te compatti. Tuttavia, è anche possibile e in alcuni casi con­si­glia­bi­le com­pri­me­re ul­te­rior­men­te i file di memoria. Questo può essere fatto, per esempio, con il programma di com­pres­sio­ne gratuito bzip2, che fa parte della libreria standard del lin­guag­gio di pro­gram­ma­zio­ne. Nell’esempio seguente, creiamo una stringa, la se­ria­liz­zia­mo e poi ap­pli­chia­mo il programma di com­pres­sio­ne:

import pickle
import bz2
stringaesempio = """Almost heaven, West Virginia
Blue Ridge Mountains, Shenandoah River
Life is old there, older than the trees
Younger than the mountains, growin' like a breeze
Country roads, take me home
To the place I belong
West Virginia, mountain mama
Take me home, country roads."""
serializzato = pickle.dumps(stringaesempio)
compresso = bz2.compress(serializzato)
python

Av­ver­ten­ze per lavorare con Python pickle

Anche se pickle di Python è un metodo pratico ed efficace per con­ver­ti­re gli oggetti, lavorare con questo modulo comporta un grosso rischio: esiste la pos­si­bi­li­tà di tra­spor­ta­re codice maligno at­tra­ver­so i dati se­ria­liz­za­ti. Sebbene questo non sia un problema con i propri dati, occorre prestare molta at­ten­zio­ne quando si lavora con file di terze parti. Per questo motivo, ti con­si­glia­mo di de­se­ria­liz­za­re sempre e solo file di memoria di cui conosci la fonte e di cui sai di poterti fidare.

Consiglio

Desideri di­stri­bui­re app e siti di­ret­ta­men­te con GitHub? Nulla di più facile, con Deploy Now di IONOS. Scegli la soluzione più adatta alle tue esigenze tra i diversi pacchetti di­spo­ni­bi­li e ap­pro­fit­ta delle pratiche funzioni di ri­le­va­men­to au­to­ma­ti­co del framework e di una con­fi­gu­ra­zio­ne rapida.

Vai al menu prin­ci­pa­le