9

Python: Introducci贸n a Pickle 馃カ

Si eres un programador habitual de aplicaciones de Python, habr谩s querido alguna vez saber hacer copias de seguridad de tus objetos de una manera eficiente, o quiz谩s simplemente enviarlos a otra aplicaci贸n escrita en Python para realizar una tarea diferente.
.
Para abordar este problema podemos utilizar muchas cosas. Si tenemos que comunicarnos con un lenguaje distinto lo m谩s habitual hoy en d铆a es utilizar archivos en formato JSON, aunque en algunos casos podemos requerir tambi茅n la presencia de los famosos XML. El inconveniente con estos formatos es que siempre tenemos que realizar una tarea de transformaci贸n para luego desestructurarlos en el lado receptor.
.
Por suerte para nosotros, si el objeto que pretendemos llevar de un lugar a otro es solo intervenido por software hecho con el lenguaje de la serpiente, existe una alternativa superior y altamente veloz: el built-in modulePickle.
.
La navaja de Pickle, la serializaci贸n de objetos

.

.
Del ingl茅s, Pickle se traduce como 鈥渃onservar en vinagre鈥, algo muy parecido a lo que hacemos cuando trabajamos con 茅l.
.
En simples palabras, serializar un objeto significa transformar el mismo en una cadena de bytes 煤nica que puede ser guardada en un archivo, archivo que, al igual que una lata, podemos desempaquetar despu茅s y trabajar con su contenido. 驴Como hacemos esto? El primer paso es importar el m贸dulo, algo sumamente sencillo porque forma parte de los m贸dulos por defecto de este gran lenguaje de programaci贸n:
.

import pickle

.
Supongamos un caso de uso divertido, la creaci贸n de un videojuego multijugador 馃幃. En nuestra l贸gica vamos a manejar datos sobre los jugadores, los cuales queremos enviar posteriormente a una base de datos en tiempo real como Firestore de Google. Resulta que tenemos dos scripts de Python corriendo en nuestro backend y los mismos necesitan comunicarse de alguna manera para pasarse esta informaci贸n que dijimos. Adem谩s, vamos a tener un tercer script que se encarga de guardar ciertos datos estad铆sticos en una base de datos relacional como MySQL para poder realizar consultas cuando el videojuego escale.
.
Nuestro script 1 almacena en una lista de diccionarios datos importantes de nuestros jugadores en un tiempo determinado:
.

players = [
        {
            'user_id':  1,
            'score':  255,
            'level':  7,
            'killed_monsters':  36,
            'deaths':  5,
            'rank': 'normal'
        },
        {
            'user_id':  2,
            'score':  12248,
            'level':  30,
            'killed_monsters':  1140,
            'deaths':  11,
            'rank': 'pro'
        },
        {
            'user_id':  3,
            'score':  10,
            'level':  1,
            'killed_monsters':  1,
            'deaths':  20,
            'rank': 'noob'
        },
    ]

.
Ahora, lo que haremos ser谩 serializar nuestro objeto lista y guardarlo en un archivo con extensi贸n .pickle. Esta tarea puede hacerse muy f谩cilmente con un par de l铆neas de c贸digo y con ayuda del m茅todo dump de nuestro m贸dulo:
.

withopen('data.pickle', 'wb') as f:
        pickle.dump(players, f)

.
Luego de ejecutar el c贸digo de arriba, tendremos en el directorio de nuestros scripts un archivo llamado data.pickle con los datos de los jugadores.
.
Nuestro objetivo era desempaquetar luego nuestra informaci贸n en nuestro script 2, lo cual es muy sencillo de hacer con el m茅todo load:
.

withopen('data.pickle', 'rb') as f:
        players = pickle.load(f)

.
Y de esta manera, sin conversiones extensas, logramos reducir tiempo de ejecuci贸n y l铆neas de c贸digo de una manera altamente veloz. 隆Pero a煤n hay m谩s! 驴Recuerdas nuestro tercer script? Como en la programaci贸n siempre existen diferentes maneras de hacer las cosas, podemos hacer uso de la clase Unpickler para, desde otro enfoque, llevar nuestros datos al programa.
.
Lo que busc谩bamos con esta 煤ltima pieza de c贸digo era cargar peri贸dicamente lo que transferimos mediante los dos scripts anteriores, para generar un peque帽o Data Warehouse donde guardar datos hist贸ricos que a futuro nos sirvan para responder preguntas del tipo: 驴Cual es el promedio de muertes de un jugador en 1 a帽o? 驴Qu茅 porcentaje de pro鈥檚__noob鈥檚 y normal players hay? 驴Cual es el jugador con el score m谩s alto? Como siempre, podemos realizarlo en unas cuantas l铆neas de c贸digo:
.

with open('data.pickle', 'rb') as f:data = pickle.Unpickler(f)
        players = data.load()

.
Hoy has aprendido a guardar tus objetos en un archivo binario, empaquetarlos y desempaquetarlos. Puedes emplearlo para realizar backups o para hacer transferencias en tu arquitectura. Pero para correr hay que caminar, por lo que si est谩s iniciando en la programaci贸n o en el aprendizaje de este importante lenguaje, te recomiendo estudiar el Curso Pr谩ctico de Python: Creaci贸n de un CRUD, con el que aprender谩s a crear tu primera app de l铆nea de comandos, la primera calle en la gigantesca ciudad de la programaci贸n 馃槈

Escribe tu comentario
+ 2