CodeGym /Corsi /Python SELF IT /Lavorare con pickle

Lavorare con pickle

Python SELF IT
Livello 22 , Lezione 1
Disponibile

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'oggetto obj e lo scrive nel file aperto file.
    • pickle.load(file): Legge dal file file e deserializza l'oggetto.
  • Lettura e scrittura di un oggetto in un array di byte
    • pickle.dumps(obj): Serializza l'oggetto obj e 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:

  1. Apertura del file in modalità scrittura byte (wb).
  2. Serializzazione dell'oggetto utilizzando pickle.dump(obj, file).
  3. Per deserializzare l'oggetto utilizziamo pickle.load(file).
  4. 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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION