Bienvenidos sean a este post, en el dia de hoy hablaremos sobre el modulo Pickle.
Hasta el post anterior hemos visto varias formas de escribir informacion de forma persistente en nuestro disco o en memoria o inclusive gracias a un servidor pero hoy hablaremos sobre un modulo que nos permite convertir los objetos de python en flujos de bytes y viceversa, aunque este modulo y json se superponen un poco con la API que exponen pero veremos que realmente son dos objetos diferentes, hasta ahora siempre que trabajamos con JSON este lo hace con formato texto o un formato humano y como vimos en este post no soportan mucho tipos de python, por el otro lado Pickle trabaja con bytes o un formato no humano, es especifico para python y gracias a las capacidades introspectivas del lenguaje soporta una gran cantidad de tipos de datos.
A pesar de estas diferencias debes considerar algunas cosas antes de usarlo, una de las mas importantes son las amenazas de seguridad a las que nos exponemos cuando es usado, porque se pueden eliminar datos o recibir datos maliciosos de lugares sospechosos creando una vulnerabilidad en nuestro sistema, por lo tanto se debe tener cuidado si desea adoptarlos en su codigo, vamos a crear un ejemplo para verlo en accion, para ello primero importaremos los modulos necesarios:
>>> import pickle
>>> from dataclasses import dataclass
Primero importaremos el modulo de pickle y luego a dataclass para crear la siguiente clase:
>>> @dataclass
... class Persona:
... nombre: str
... apellido: str
... id: int
... def saludo(self):
... print(f'Hola, soy {self.nombre} {self.apellido}'
... f' y mi ID es {self.id}'
... )
...
>>>
Esta sera una clase de tipo Clase de datos llamada Persona, en ella almacenaremos tres datos:
- nombre, de tipo string
- apellido, de tipo string
- id, de tipo int
Dentro de esta clase definimos un metodo llamado saludo, esta la usaremos para mostrar los distintos datos que pasaremos a cada persona que generemos con esta clase, para ello usaremos a f para dar formato al texto a mostrar, con esto comentado pasemos a crear un grupo de gente:
>>> gente = [
... Persona('DarkZero', 'Aleman', 100123),
... Persona('Enzo', 'Tortore', 100456),
... Persona('Martin', 'Miranda', 100789),
... ]
>>>
En este caso creamos una lista llamada gente, y en este guardaremos a tres personas, con su nombre y apellido y el id que le corresponde, vamos a crear un archivo para almacenar esta informacion en nuestro disco, para ello usaremos el siguiente bloque:
>>> with open('datos.pickle','wb') as flujo:
... pickle.dump(gente, flujo)
...
>>>
Volvemos a usar open pero esta vez enviaremos la opcion wb para que lo escriba en binario, la otra diferencia va a estar en que modulo vamos a usar para hacer el vuelco, en este caso usamos a pickle en lugar de json, le pasamos a gente y el archivo que esta contenido en flujo, con esto creamos el archivo, veamos como recuperar esta informacion:
>>> with open('datos.pickle','rb') as flujo:
... personas = pickle.load(flujo)
...
>>>
Como en el caso anterior utilizamos a open pero con el rb para que lea en binario y el resultado de load ejecutado desde pickle lo almacenamos en personas, pasemos a mostrar los mensajes en pantalla:
>>> for persona in personas:
... persona.saludo()
...
Hola, soy DarkZero Aleman y mi ID es 100123
Hola, soy Enzo Tortore y mi ID es 100456
Hola, soy Martin Miranda y mi ID es 100789
>>>
Para esto usaremos un for donde obtendremos cada una de las personas y la pasaremos a persona, despues llamaremos al metodo saludo de cada una de ellas, y como pueden ver la salida nos devolvio el saludo a cada una de ellas con sus respectivos datos, si se preguntan como quedo el archivo generado aqui les comparto el contenido:
�]q(c__main__
Persona
q)�q}q(XnombreqDarkZeroqapellidoqXAlemanqXidJubh)�q }q
(hXEnzoq
hXTortoreq
}q(hXMartinqhXMirandaqJ��ube.
Como ultima aclaracion el contenido creado en el archivo de ustedes puede variar con respecto a este porque dependera del sistema operativo y del equipo en si pero si obtendran algo parecido a esto.
En resumen, hoy hemos visto como trabajar con pickle, como comparte algunas conductas con json pero al trabajar de forma distinta (lo hace en bytes) nos permite trabajar de una manera mas eficiente con respecto a los distintos tipos que podemos manejar en python evitando el principal inconveniente de JSON pero creando mas posibilidades de poder tener mas vulnerabilidades a ataques maliciosos, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
