Persistance des données Python - Module Pickle

La terminologie de Python pour la sérialisation et la désérialisation est respectivement le pickling et le unpickling. Le module pickle de la bibliothèque Python utilise un format de données très spécifique à Python. Par conséquent, les applications non Python peuvent ne pas être en mesure de désérialiser correctement les données décapées. Il est également conseillé de ne pas décoller les données d'une source non authentifiée.

Les données sérialisées (picklées) peuvent être stockées dans une chaîne d'octets ou un fichier binaire. Ce module définitdumps() et loads()fonctions pour sélectionner et décoller les données à l'aide d'une chaîne d'octets. Pour les processus basés sur des fichiers, le module adump() et load() fonction.

Les protocoles pickle de Python sont les conventions utilisées dans la construction et la déconstruction d'objets Python vers / à partir de données binaires. Actuellement, le module pickle définit 5 protocoles différents comme indiqué ci-dessous -

N ° Sr. Noms et description
1

Protocol version 0

Protocole original «lisible par l'homme» rétrocompatible avec les versions antérieures.

2

Protocol version 1

Ancien format binaire également compatible avec les versions antérieures de Python.

3

Protocol version 2

Introduit dans Python 2.3 fournit un décapage efficace des classes de nouveau style.

4

Protocol version 3

Ajouté dans Python 3.0. recommandé lorsque la compatibilité avec d'autres versions de Python 3 est requise.

5

Protocol version 4

a été ajouté dans Python 3.4. Il ajoute la prise en charge des très gros objets

Exemple

Le module pickle se compose de la fonction dumps () qui renvoie une représentation sous forme de chaîne de données picklées.

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

Production

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.

Exemple

Utilisez la fonction charges () pour décocher la chaîne et obtenir l'objet dictionnaire d'origine.

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

Production

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

Les objets décapés peuvent également être stockés de manière persistante dans un fichier disque, en utilisant la fonction dump () et récupérés en utilisant la fonction 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()

Le module pickle fournit également une API orientée objet pour un mécanisme de sérialisation sous la forme de Pickler et Unpickler Des classes.

Comme mentionné ci-dessus, tout comme les objets intégrés dans Python, les objets des classes définies par l'utilisateur peuvent également être sérialisés de manière persistante dans un fichier disque. Dans le programme suivant, nous définissons une classe User avec le nom et le numéro de mobile comme attributs d'instance. En plus du constructeur __init __ (), la classe remplace la méthode __str __ () qui renvoie une représentation sous forme de chaîne de son objet.

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

Pour décaper l'objet de la classe ci-dessus dans un fichier, nous utilisons la classe pickler et sa méthode 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()

Inversement, la classe Unpickler a la méthode load () pour récupérer l'objet sérialisé comme suit -

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