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.
Proseguendo lungo il percorso, troviamo alcune stazioni che monitorano la distribuzione dell'acqua e la qualità del suolo del terreno che viene sviluppato per un futuro raccolto. Per elaborare i dati, è efficiente serializzarli. Sebbene l'uso di Json possa essere efficace come soluzione generalizzata, esistono anche alcuni metodi di serializzazione specifici per Python, ovvero i moduli Marshal e Pickle. Il modulo Marshal è progettato per una serializzazione/deserializzazione rapida convertendo i dati in 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 più grandi o prioritarie.
Per utilizzare i moduli Marshal e Pickle, importa le loro funzioni scrivendo: import marshal e import pickle. Per i nostri scopi, utilizzeremo le seguenti funzioni:
marshal.dumps(): Serializza i dati in formato binario, progettato per la velocità in Python. Accetta un argomento, ossia i dati che desideri 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 veloce. Accetta un argomento, ossia i dati da deserializzare.pickle.DEFAULT_PROTOCOL: Verifica quale versione del protocollo di serializzazione Pickle è la predefinita nella tua versione di Python. I protocolli influenzano il modo in cui i dati vengono serializzati.pickle.HIGHEST_PROTOCOL: Verifica quale versione del protocollo di 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 Python complesse in formato binario secondo il protocollo utilizzato. Accetta due argomenti, i dati che desideri serializzare e la versione del protocollo che desideri utilizzare durante la serializzazione.pickle.loads(): Deserializza i dati binari in tipi di dati leggibili da Python, con una portata potente per gli oggetti Python. Accetta un argomento, ossia i dati che desideri deserializzare.
In aggiunta a questi moduli e funzioni, utilizzeremo anche un modulo di formattazione chiamato pformat, che importeremo usando from pprint import pformat. Questo ci permette di utilizzare la funzione pformat() che può essere usata per formattare strutture dati come i dizionari, permettendoci di visualizzare le informazioni in modo chiaro.
Per iniziare, cammina verso il marchio a X luminoso all'interno della piccola stazione di monitoraggio e rivolgiti al terminale del computer. La stazione monitora la pressione dell'acqua e le condizioni del suolo del terreno nelle vicinanze, che viene sviluppato per la coltivazione. Esiste una costante denominata reading, che contiene i dati Python raccolti dalla stazione.
Crea una variabile chiamata data e memorizza il valore della funzione marshal.dumps() impostando reading come argomento. In questo modo: data = marshal.dumps(reading). Utilizza la variabile data con la funzione pre-scritta display() per visualizzare i dati serializzati della variabile.
Esci dalla stazione e dirigiti verso il marchio a X dorato, usa la funzione open() per aprire la porta e accedere all'ufficio. Cammina verso il marchio a X luminoso di fronte al terminale e deserializza i dati che hai appena serializzato. Crea una variabile chiamata output e memorizza il valore di marshal.loads() impostando come argomento la variabile data precedente. Utilizza la funzione write() ed aggiungi output come argomento per accedere ai dati serializzati che hai raccolto dalla stazione di monitoraggio.
Cammina verso il marchio a X luminoso sopra il tappeto blu nell'ufficio, sul terminale verificheremo i protocolli per determinare quale tipo di serializzazione il modulo Pickle utilizzerà durante l'elaborazione dei dati. Nella funzione pre-scritta write(), imposta gli argomenti come pickle.DEFAULT_PROTOCOL e pickle.HIGHEST_PROTOCOL. Questo verificherà quale sia il protocollo di serializzazione corrente e quale sia il protocollo di serializzazione più recente disponibile al momento.
Prosegui verso il marchio a X scuro sopra il tappeto blu, ora che abbiamo confermato i protocolli, possiamo verificare i dati memorizzati. I dati sono stati raccolti e memorizzati nel corso dei mesi e salvati in una costante denominata samples. Crea tre variabili chiamate: sereal_0, sereal_2 e sereal_5; le useremo per verificare tre dei protocolli disponibili per la serializzazione. Il protocollo 0 è leggibile in ASCII, non molto efficiente, il protocollo 2 è un formato binario più efficiente e il protocollo 5 è il più recente con le funzionalità più complesse aggiunte.
Memorizzeremo il valore di pickle.dumps() impostando come argomenti la costante sample e il protocol corrispondente al numero nel nome della variabile. Ad esempio, per sereal_0 imposteremo il protocol a 0, in questo modo: sereal_0 = pickle.dumps(samples, protocol=0). Utilizza sereal_0, sereal_2 e sereal_5 con la funzione pre-scritta display() per verificare quanto diversa sia la serializzazione per ciascun protocollo.
Cammina verso il marchio a X luminoso sopra il tappeto rosso e rivolgiti al terminale, sovrascrivi la variabile output e memorizza il valore di pickle.loads() impostando come argomento sereal_5 per deserializzare i dati di esempio che sono stati raccolti finora. Utilizza la funzione display() ed aggiungi la funzione pformat() con la variabile output per visualizzare i dati. In questo modo: await player.display(pformat(output)). Prendi nota delle valutazioni per ogni mese visualizzate nel terminale in modo da poterle annotare in seguito.
Cammina verso il marchio a X scuro sopra il tappeto rosso e rivolgiti alla scrivania, nella funzione pre-scritta write(), aggiungi le valutazioni che hai annotato per ogni mese, che erano state precedentemente visualizzate nel terminale. Aggiungile come stringhe con i segni "" nell'ordine corretto come indicato nella funzione per completare il livello.