Persistencia de datos de Python: módulo Pickle

La terminología de Python para serialización y deserialización es decapado y desequilibrado respectivamente. El módulo pickle de la biblioteca de Python utiliza un formato de datos muy específico de Python. Por lo tanto, es posible que las aplicaciones que no sean de Python no puedan deserializar correctamente los datos decapados. También se recomienda no eliminar datos de una fuente no autenticada.

Los datos serializados (encurtidos) se pueden almacenar en una cadena de bytes o en un archivo binario. Este módulo definedumps() y loads()funciones para encurtir y despejar datos usando cadenas de bytes. Para procesos basados ​​en archivos, el módulo tienedump() y load() función.

Los protocolos pickle de Python son las convenciones que se utilizan para construir y deconstruir objetos de Python a / desde datos binarios. Actualmente, el módulo pickle define 5 protocolos diferentes que se enumeran a continuación:

No Señor. Nombres y descripción
1

Protocol version 0

Protocolo original "legible por humanos" compatible con versiones anteriores.

2

Protocol version 1

El formato binario antiguo también es compatible con versiones anteriores de Python.

3

Protocol version 2

Introducido en Python 2.3 proporciona un decapado eficiente de clases de nuevo estilo.

4

Protocol version 3

Agregado en Python 3.0. recomendado cuando se requiere compatibilidad con otras versiones de Python 3.

5

Protocol version 4

se agregó en Python 3.4. Agrega soporte para objetos muy grandes

Ejemplo

El módulo pickle consta de la función dumps () que devuelve una representación de cadena de datos encurtidos.

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

Salida

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.

Ejemplo

Utilice la función cargas () para deshacer la cadena y obtener el objeto de diccionario original.

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

Salida

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

Los objetos en escabeche también se pueden almacenar de manera persistente en un archivo de disco, usando la función dump () y recuperados usando la función 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()

El módulo pickle también proporciona una API orientada a objetos para el mecanismo de serialización en forma de Pickler y Unpickler Clases.

Como se mencionó anteriormente, al igual que los objetos integrados en Python, los objetos de las clases definidas por el usuario también se pueden serializar de forma persistente en el archivo de disco. En el siguiente programa, definimos una clase de usuario con nombre y número de móvil como atributos de instancia. Además del constructor __init __ (), la clase anula el método __str __ () que devuelve una representación de cadena de su objeto.

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

Para seleccionar un objeto de la clase anterior en un archivo, usamos la clase pickler y su método 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()

Por el contrario, la clase Unpickler tiene el método load () para recuperar el objeto serializado de la siguiente manera:

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