Los pickles de Python

Los pickles de Python son la mar de útiles ya que representan un objeto Python como una cadena de bytes. Se pueden hacer multitud de cosas con dichos bytes, como por ejemplo, almacenarlos en un archivo o base de datos, o transferirlos a través de una red.

La representación “pickle” de un objeto Python, se denomina archivo pickle. El archivo pickle, por tanto, se puede utilizar para distintos propósitos, como el almacenamiento de resultados para que sea utilizado por otro programa Python, o bien para crear copias de seguridad. Para obtener el objeto original de Python, simplemente tienes que “unpicklear” esa cadena de bytes.

Para utilizar los pickles en Python, utilizaremos el módulo Pickle. Este nos permite almacenar casi cualquier objeto Python directamente en un archivo o cadena sin necesidad de realizar ninguna conversión. Lo que el módulo pickle realiza en realidad es lo que se llama serialización de objetos, es decir, convertir objetos a y de cadenas de bytes. El objeto que va a ser pickled se serializará en un flujo de bytes, los cuales se pueden escribir en un archivo, por ejemplo, y restaurar en un punto posterior.

Instalación

El módulo Pickle viene ya incluido en la instalación de Python. Para obtener una lista de los módulos instalados, puede escribir el siguiente comando en el prompt de Python: help('modules').

Así que todo lo que tienes que hacer para trabajar con el módulo Pickle es: import pickle!

Crear un archivo Pickle

A partir de esta sección, vamos a echar un vistazo a algunos ejemplos de pickling para entender mejor el concepto. Empecemos por crear un archivo pickle de un objeto. El objeto que utilizaremos será la lista de tareas que hicimos en el tutorial de listas de Python.

todo = ['write blog post', 'reply to email', 'read in a book']

Con el fin de convertir a pickle nuestro objeto de lista (todo), podemos hacer lo siguiente:

import pickle
 
todo = ['write blog post', 'reply to email', 'read in a book']
pickle_file = file('todo.pickle', 'w')
pickle.dump(todo, pickle_file)

Ten en cuenta que hemos hecho un import pickle para poder utilizar el módulo Pickle. También hemos creado un archivo pickle para almacenar el objeto que vamos a hacer pickle, es decir todo.pickle. La función dump graba una representación pickled de “todo” en el objeto de fichero pickle_file. En otras palabras, la función dump tiene dos argumentos: el objeto pickle, que es la lista de tareas y un objeto file donde queremos escribir el pickle, que es todo.pickle.

Unpickling (restaurar) los datos pickled

Digamos que nos gustaría restaurar los datos pickled (en nuestro caso, la lista de tareas). Para ello, podemos utilizar el siguiente script:

import pickle
 
pickle_file = file('todo.pickle')
todo = pickle.load(pickle_file)
print(todo)

El anterior script listará los elementos de “todo”.

['write blog post', 'reply to email', 'read in a book']

Pickles como strings

En la sección anterior, hemos visto cómo podemos escribir/cargar pickles a/de un archivo. Sin embargo, esto no es necesario. Quiero decir que si queremos escribir/cargar pickles, no siempre tenemos que tratar con archivos, sino que podemos trabajar con pickles como cadenas. De este modo, podemos hacer lo siguiente:

import pickle
 
todo = ['write blog post', 'reply to email', 'read in a book']
pickled_data = pickle.dumps(todo)
print(pickled_data)

Ojo, he utilizado la función dumps (con una “s” al final) que, de acuerdo a la documentación, devuelve la representación de un pickle como una cadena, en lugar de hacerlo en un archivo.

Con el fin de restaurar los datos pickled de antes, podemos utilizar la función load(string), tal que así:

restored_data = pickle.loads(pickled_data)

¿Y cómo hacerlo con más de un objeto?

En los ejemplos de antes, hemos creado un pickled y hemos hecho su respectiva restauración de un sólo objeto a la vez. En esta sección, os mostraré cómo proceder para hacer lo mismo en más de un objeto a la vez. Digamos que tenemos los siguientes objetos:

name = 'Jorge'
website = 'http://programacion.net'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple

Simplemente podemos escoger los objetos anteriores ejecutando una serie de funciones de volcado, de la siguiente manera:

import pickle
 
name = 'Jorge'
website = 'http://programacion.net'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple
 
pickled_file = open('pickled_file.pickle', 'w')
pickle.dump(name, pickled_file)
pickle.dump(website, pickled_file)
pickle.dump(english_french, pickled_file)
pickle.dump(tup, pickled_file)

Esto creará un único fichero pickle de los cuatro objetos llamado pickled_file.pickle.

Existe otra fabulosa manera de escribir el anterior script haciendo uso de la clase Pickler:

from pickle import Pickler
 
name = 'Jorge'
website = 'http://programacion.net'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple
 
pickled_file = open('pickled_file.pickle', 'w')
p = Pickler(pickled_file)
p.dump(name); p.dump(website); p.dump(english_french); p.dump(tup)

Para restaurar los datos originales, podemos utilizar más de una función load. Echa un vistazo:

import pickle
 
pickled_file = open('pickled_file.pickle')
 
name = pickle.load(pickled_file)
website = pickle.load(pickled_file)
english_french = pickle.load(pickled_file)
tup = pickle.load(pickled_file)
 
print('Name: ')
print(name)
print('Website:')
print(website)
print('Englsh to French:')
print(english_french)
print('Tuple data:')
print(tup)

Para mostrar el anterior script sería:

Name: 
Abder
Website:
http://abder.io
Englsh to French:
{'car': 'voiture', 'pen': 'stylo', 'paper': 'papier'}
Tuple data:
(31, 'abder', 4.0)

Al igual que con la clase Pickler, podemos volver a escribir el script anterior usando la clase Unpickler, de la siguiente manera:

from pickle import Unpickler
 
pickled_file = open('pickled_file.pickle')
u = Unpickler(pickled_file)
name = u.load(); website = u.load(); english_french = u.load(); tup = u.load()
 
print('Name: ')
print(name)
print('Website:')
print(website)
print('English to French:')
print(english_french)
print('Tuple data:')
print(tup)

Ten en cuenta que las variables deben escribirse y leerse en el mismo orden para obtener la salida deseada. Para evitar cualquier problema, podemos utilizar un diccionario para administrar los datos, de la siguiente manera:

import pickle
 
name = 'Jorge'
website = 'http://programacion.net'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple
 
pickled_file = open('pickled_file.pickle', 'w')
data = {'name':name, 'website':website,'english_french_dictionary':english_french,'tuple':tup }
pickle.dump(data, pickled_file)

Para restaurar los datos pickled en el anterior script, podemos hacer lo siguiente:

import pickle
 
pickled_file = open('pickled_file.pickle')
data = pickle.load(pickled_file)
 
name = data['name']
website = data['website']
english_french = data['english_french_dictionary']
tup = data['tuple']
 
print('Name: ')
print(name)
print('Website:')
print(website)
print('English to French:')
print(english_french)
print('Tuple data:')
print(tup)

Fuente: Abder-Rahman Ali

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP