Corso avanzato di sviluppo Python
Capitolo
>
Livello

Moduli di serializzazione
Moduli Marshal e Pickle

Obiettivo

Vai alla stazione di servizio e assicurati che i dati siano memorizzati correttamente utilizzando il modulo JSON per formattare i file.

Continuando lungo il percorso, troviamo alcune stazioni che monitorano la distribuzione dell'acqua e la qualità del suolo del terreno in fase di sviluppo per un futuro raccolto. Per elaborare i dati, è efficiente serializzarli. Sebbene usare JSON possa essere efficace come soluzione generalizzata, esistono anche alcuni metodi di serializzazione specifici di Python, ossia i moduli Marshal e Pickle.

Il modulo Marshal è progettato per una serializzazione/deserializzazione rapida convertendo i dati in formato binario, ideale per trasferimenti di dati più semplici. Il modulo Pickle è più lento ma è progettato per elaborare strutture dati più complesse ed è molto più flessibile, ideale per strutture dati di dimensioni maggiori o di priorità più alta.

Per utilizzare i moduli Marshal e Pickle, importa le loro funzioni scrivendo: import marshal e import pickle. Ai fini di questo esercizio, utilizzeremo le seguenti funzioni:

  • marshal.dumps(): serializza i dati in un formato binario, progettato per la velocità in Python. Accetta un argomento, che è il dato da serializzare, ed è limitato ai tipi di dati di base.
  • marshal.loads(): deserializza i dati binari in tipi di dati leggibili da Python, con capacità limitate ma esecuzione rapida. Richiede un argomento: i dati da deserializzare.
  • pickle.DEFAULT_PROTOCOL: verifica quale versione di protocollo per la serializzazione Pickle è impostata come predefinita nella tua versione di Python. I protocolli influenzano il modo in cui i dati vengono serializzati.
  • pickle.HIGHEST_PROTOCOL: verifica quale versione di protocollo per la serializzazione Pickle è la più alta disponibile nella tua versione di Python. I protocolli influenzano il modo in cui i dati vengono serializzati.
  • pickle.dumps(): serializza strutture dati complesse di Python in formato binario in base al protocollo utilizzato. Richiede due argomenti: i dati da serializzare e la versione del protocollo da utilizzare.
  • pickle.loads(): deserializza dati binari in tipi di dati leggibili da Python, con un'ampia portata per gli oggetti Python. Richiede un argomento: i dati da deserializzare.

Oltre a questi moduli e funzioni, utilizzeremo anche un modulo di formattazione chiamato pformat, che importeremo con from pprint import pformat. Questo ci permette di utilizzare la funzione pformat() per formattare strutture dati come dizionari, consentendo di visualizzare le informazioni in modo chiaro.

Per iniziare, cammina fino al segno X chiaro all'interno della piccola stazione di monitoraggio e affronta il terminale del computer. La stazione monitora la pressione dell'acqua e le condizioni del suolo del terreno circostante in fase di sviluppo per la coltivazione delle colture. C'è una costante chiamata reading, che contiene i dati Python raccolti dalla stazione.

Crea una variabile chiamata data e memorizza il valore restituito dalla funzione marshal.dumps() passando reading come argomento. Ad esempio: data = marshal.dumps(reading). Usa la variabile data con la funzione display() predefinita per visualizzare i dati serializzati.

Esci dalla stazione e dirigiti al segno X dorato, usa la funzione open() per aprire la porta e accedere all'ufficio. Cammina fino al segno X chiaro di fronte al terminale e deserializza i dati appena serializzati. Crea una variabile chiamata output e memorizza il valore restituito da marshal.loads() utilizzando la variabile data come argomento. Usa la funzione write() aggiungendo output come argomento per accedere ai dati serializzati raccolti dalla stazione di monitoraggio.

Cammina fino al segno X chiaro sul tappeto blu nell'ufficio; al terminale verificheremo i protocolli per determinare quale tipo di serializzazione il modulo pickle utilizzerà durante l'elaborazione dei dati. Nella funzione write() predefinita, imposta gli argomenti su pickle.DEFAULT_PROTOCOL e pickle.HIGHEST_PROTOCOL. Questo permetterà di verificare sia il protocollo di serializzazione corrente sia quello più recente disponibile al momento.

Spostati al segno X scuro sul tappeto blu: ora che abbiamo confermato i protocolli, possiamo verificare i dati archiviati. I dati sono stati raccolti e memorizzati nei mesi in una costante chiamata samples. Crea tre variabili chiamate: sereal_0, sereal_2 e sereal_5; le utilizzeremo per verificare tre dei protocolli disponibili per la serializzazione. Il protocollo 0 è in ASCII leggibile, poco efficiente; il protocollo 2 è un formato binario più efficiente; il protocollo 5 è l'ultimo, con le funzionalità più complesse.

Memorizzeremo il valore restituito da pickle.dumps() impostando come argomenti la costante samples e il protocol corrispondente al numero nel nome della variabile. Per esempio, per sereal_0 imposteremo il protocol a 0, in questo modo: sereal_0 = pickle.dumps(samples, protocol=0). Usa sereal_0, sereal_2 e sereal_5 con la funzione display() predefinita per verificare come varia la serializzazione tra i diversi protocolli.

Cammina fino al segno X chiaro sul tappeto rosso e affronta il terminale; sovrascrivi la variabile output e memorizza il valore restituito da pickle.loads() impostando come argomento sereal_5 per deserializzare i dati di esempio raccolti finora. Usa la funzione display() e applica la funzione pformat() alla variabile output per visualizzare i dati. Ad esempio: await player.display(pformat(output)). Annota le valutazioni di ogni mese visualizzate nel terminale in modo da poterle riportare in seguito.

Cammina fino al segno X scuro sul tappeto rosso e affronta la scrivania; nella funzione write() predefinita, aggiungi le valutazioni che hai annotato per ogni mese, precedentemente visualizzate nel terminale. Inseriscile come stringhe tra virgolette ("") nell'ordine corretto, come indicato nella funzione, per completare il livello.

Libro del Codice