12

Python: Introducción a Pickle 🥫

44995Puntos

hace 5 años

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 “conservar 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’s__noob’s 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 😉

Facundo Nicolás
Facundo Nicolás
facmartoni

44995Puntos

hace 5 años

Todas sus entradas
Escribe tu comentario
+ 2