Persistenza dei dati Python - Modulo Pickle

La terminologia di Python per la serializzazione e la deserializzazione è rispettivamente pickling e unpickling. Il modulo pickle nella libreria Python, utilizza un formato di dati molto specifico per Python. Pertanto, le applicazioni non Python potrebbero non essere in grado di deserializzare correttamente i dati selezionati. Si consiglia inoltre di non separare i dati da una fonte non autenticata.

I dati serializzati (decapati) possono essere memorizzati in una stringa di byte o in un file binario. Questo modulo definiscedumps() e loads()funzioni per pickle e unpickle dati usando una stringa di byte. Per il processo basato su file, il modulo hadump() e load() funzione.

I protocolli pickle di Python sono le convenzioni utilizzate nella costruzione e decostruzione di oggetti Python da / a dati binari. Attualmente, il modulo pickle definisce 5 diversi protocolli come elencato di seguito -

Sr.No. Nomi e descrizione
1

Protocol version 0

Protocollo originale "leggibile dall'uomo" retrocompatibile con le versioni precedenti.

2

Protocol version 1

Vecchio formato binario compatibile anche con le versioni precedenti di Python.

3

Protocol version 2

Introdotto in Python 2.3 fornisce un efficiente pickling delle classi di nuovo stile.

4

Protocol version 3

Aggiunto in Python 3.0. consigliato quando è richiesta la compatibilità con altre versioni di Python 3.

5

Protocol version 4

è stato aggiunto in Python 3.4. Aggiunge il supporto per oggetti molto grandi

Esempio

Il modulo pickle è costituito dalla funzione dumps () che restituisce una rappresentazione di stringa di dati decapati.

from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)

Produzione

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.

Esempio

Utilizzare la funzione load () per rimuovere il pickle dalla stringa e ottenere l'oggetto dizionario originale.

from pickle import load
dct=loads(dctstring)
print (dct)

Produzione

{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

Gli oggetti decapati possono anche essere memorizzati in modo persistente in un file su disco, utilizzando la funzione dump () e recuperati utilizzando la funzione load ().

import pickle
f=open("data.txt","wb")
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

#to read
import pickle
f=open("data.txt","rb")
d=pickle.load(f)
print (d)
f.close()

Il modulo pickle fornisce anche API orientate agli oggetti per il meccanismo di serializzazione sotto forma di Pickler e Unpickler classi.

Come accennato in precedenza, proprio come gli oggetti incorporati in Python, anche gli oggetti delle classi definite dall'utente possono essere serializzati in modo persistente nel file su disco. Nel programma seguente, definiamo una classe utente con nome e numero di cellulare come attributi di istanza. Oltre al costruttore __init __ (), la classe sovrascrive il metodo __str __ () che restituisce una rappresentazione di stringa del suo oggetto.

class User:
   def __init__(self,name, mob):
      self.name=name
      self.mobile=mob
   def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))

Per decapare l'oggetto della classe precedente in un file usiamo la classe pickler e il suo metodo dump ().

from pickle import Pickler
user1=User('Rajani', '[email protected]', '1234567890')
file=open('userdata','wb')
Pickler(file).dump(user1)
Pickler(file).dump(user2)
file.close()

Al contrario, la classe Unpickler ha il metodo load () per recuperare l'oggetto serializzato come segue:

from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)