Post Top Ad

Your Ad Spot

martes, 9 de julio de 2019

Introducción al módulo Python Pickle

Introducción

El decapado es un método popular para conservar los alimentos. Según Wikipedia , también es un procedimiento bastante antiguo; aunque los orígenes del decapado son desconocidos, los antiguos mesopotámicos probablemente usaron el proceso hace 4400 años. Al colocar un producto en una solución específica, es posible aumentar drásticamente su vida útil. En otras palabras, es un método que nos permite almacenar alimentos para su posterior consumo.
Si eres un desarrollador de Python, es posible que algún día necesites una manera de almacenar tus objetos de Python para usarlos más adelante. Bueno, ¿y si te lo dijera, también puedes declinar objetos de Python?

Publicación por entregas

La serialización es un proceso de transformación de objetos o estructuras de datos en flujos de bytes o cadenas. Un flujo de bytes es, bueno, un flujo de bytes; un byte se compone de 8 bits de ceros y unos. Estas corrientes de bytes se pueden almacenar o transferir fácilmente. Esto permite a los desarrolladores guardar, por ejemplo, los datos de configuración o el progreso del usuario, y luego almacenarlos (en el disco o en una base de datos) o enviarlos a otra ubicación.
Los objetos de Python también pueden ser serializados usando un módulo llamado Pickle .
Una de las principales diferencias entre los objetos de Python y los vegetales de decapado es el cambio inevitable e irreversible del sabor y la textura de los alimentos decapados. Mientras tanto, los objetos Python en escabeche pueden ser fácilmente despojados a su forma original. Este proceso, por cierto, se conoce universalmente como deserialización .
El decapado (o la serialización en general) no debe confundirse con la compresión. El propósito del decapado es traducir los datos a un formato que se pueda transferir desde la RAM al disco. La compresión, por otro lado, es un proceso de codificación de datos que utiliza menos bits (para ahorrar espacio en el disco).
La serialización es especialmente útil en cualquier software donde es importante poder guardar algo de progreso en el disco, salir del programa y luego volver a cargar el progreso después de volver a abrir el programa. Los videojuegos pueden ser el ejemplo más intuitivo de la utilidad de la serialización, pero hay muchos otros programas donde guardar y cargar el progreso o los datos de un usuario es crucial.

Pickle vs JSON

Existe la posibilidad de que haya oído hablar de JSON(Notación de objetos de JavaScript), que es un formato popular que también permite a los desarrolladores guardar y transmitir objetos codificados como cadenas. Este método de serialización tiene algunas ventajas sobre el decapado. El formato JSON es legible para el ser humano, independiente del lenguaje y más rápido que el pickle.
Sin embargo, también tiene algunas limitaciones importantes. Lo más importante es que, de forma predeterminada, solo un subconjunto limitado de tipos incorporados de Python se puede representar mediante JSON. Con Pickle, podemos serializar fácilmente un amplio espectro de tipos de Python y, lo que es más importante, clases personalizadas. Esto significa que no necesitamos crear un esquema personalizado (como lo hacemos para JSON) y escribir serializadores y analizadores propensos a errores. Todos los levantamientos pesados ​​están hechos para ti con Pickle.

Lo que puede ser escabechado y despegado

Los siguientes tipos pueden ser serializados y deserializados usando el módulo Pickle:
  • Todos los tipos de datos nativos compatibles con Python (booleanos, ninguno, enteros, flotantes, números complejos, cadenas, bytes, matrices de bytes)
  • Diccionarios, conjuntos, listas y tuplas, siempre que contengan objetos que se puedan recoger
  • Funciones y clases que se definen en el nivel superior de un módulo
Es importante recordar que el decapado no es un método de serialización independiente del idioma, por lo tanto, sus datos encurtidos solo se pueden eliminar con Python. Además, es importante asegurarse de que los objetos se decapen utilizando la misma versión de Python que se usará para eliminarlos . Mezclar versiones de Python, en este caso, puede causar muchos problemas.
Además, las funciones se declinan por sus referencias de nombre y no por su valor. El pickle resultante no contiene información sobre el código o los atributos de la función. Por lo tanto, debe asegurarse de que el entorno donde la función no está seleccionada puede importar la función. En otras palabras, si seleccionamos una función y luego la eliminamos en un entorno donde no está definida o no se importa, se generará una excepción.
También es muy importante tener en cuenta que los objetos en escabeche se pueden utilizar de manera malévola. Por ejemplo, la eliminación de datos de una fuente no confiable puede resultar en la ejecución de un código malicioso.

Decapado de una lista de Python

El siguiente ejemplo, muy simple, muestra los conceptos básicos del uso del módulo Pickle en Python 3 :
import pickle

test_list = ['cucumber', 'pumpkin', 'carrot']

with open('test_pickle.pkl', 'wb') as pickle_out:  
    pickle.dump(test_list, pickle_out)
Primero, tenemos que importar el picklemódulo, que se realiza en la línea 1. En la línea 3 definimos una lista simple de tres elementos que será decapada.
En la línea 5 indicamos que el nombre de nuestro archivo de pickle de salida será test_pickle.pklAl usar la wbopción, le decimos al programa que queremos escribir ( w) datos binarios ( b) dentro de él (porque queremos crear un flujo de bytes). Tenga en cuenta que la pklextensión no es necesaria; la estamos utilizando en este tutorial porque es la extensión incluida en la documentación de Python.
En la línea 6 usamos el pickle.dump()método para encurtir nuestra lista de pruebas y almacenarla dentro del test_pickle.pklarchivo.
Le animo a que intente abrir el archivo pickle generado en su editor de texto. Notará rápidamente que un flujo de bytes definitivamente no es un formato legible por humanos.

Descomprimiendo una lista de Python

Ahora, vamos a descomprimir el contenido del archivo de pickle de prueba y devolver nuestro objeto a su forma original.
import pickle

with open('test_pickle.pkl', 'rb') as pickle_in:  
    unpickled_list = pickle.load(pickle_in)

print(unpickled_list)  
Como puede ver, este procedimiento no es más complicado que cuando decapamos el objeto. En la línea 3 volvemos a abrir nuestro test_pickle.pklarchivo, pero esta vez nuestro objetivo es leer ( r) los datos binarios ( b) almacenados en él.
A continuación, en la línea 5, usamos el pickle.load()método para desentrañar nuestra lista y almacenarla en la unpickled_listvariable.
Luego puede imprimir el contenido de la lista para ver si es idéntico a la lista que seleccionamos en el ejemplo anterior. Aquí está la salida de ejecutar el código anterior:
$ python unpickle.py
['cucumber', 'pumpkin', 'carrot']

Decapado y despiece de objetos personalizados

Como mencioné anteriormente, utilizando Pickle, puede serializar sus propios objetos personalizados. Echa un vistazo al siguiente ejemplo:
import pickle

class Veggy():  
    def __init__(self):
        self.color = ''
    def set_color(self, color):
        self.color = color

cucumber = Veggy()  
cucumber.set_color('green')

with open('test_pickle.pkl', 'wb') as pickle_out:  
    pickle.dump(cucumber, pickle_out)

with open('test_pickle.pkl', 'rb') as pickle_in:  
    unpickled_cucumber = pickle.load(pickle_in)

print(unpickled_cucumber.color)  
Como puede ver, este ejemplo es casi tan simple como el anterior. Entre las líneas 3 y 7 definimos una clase simple que contiene un atributo y un método que cambia este atributo. En la línea 9 creamos una instancia de esa clase y la almacenamos en la cucumbervariable, y en la línea 10 establecemos su atributo coloren "verde".
Luego, usando exactamente las mismas funciones que en el ejemplo anterior, recogemos y deshacemos nuestro cucumberobjeto recién creado Ejecutar el código anterior da como resultado el siguiente resultado:
$ python unpickle_custom.py
green  
Recuerde que solo podemos desentrañar el objeto en un entorno donde la clase Veggyestá definida o importada. Si creamos una nueva secuencia de comandos e intentamos deshacer la búsqueda del objeto sin importar la Veggyclase, obtendremos un "AttributeError". Por ejemplo, ejecute el siguiente script:
import pickle

with open('test_pickle.pkl', 'rb') as pickle_in:  
    unpickled_cucumber = pickle.load(pickle_in)

print(unpickled_cucumber.color)  
En la salida del script anterior, verá el siguiente error:
$ python unpickle_simple.py
Traceback (most recent call last):  
  File "<pyshell#40>", line 2, in <module>
    unpickled_cucumber = pickle.load(pickle_in)
AttributeError: Can't get attribute 'Veggy' on <module '__main__' (built-in)>  

Conclusión

Como puede ver, gracias al módulo Pickle, la serialización de objetos de Python es bastante simple. En nuestros ejemplos, seleccionamos una simple lista de Python, pero puede usar el mismo método exacto para guardar un amplio espectro de tipos de datos de Python, siempre y cuando se asegure de que sus objetos contengan solo otros objetos seleccionables.
Pickling tiene algunas desventajas, la mayor de las cuales podría ser el hecho de que solo puede desentrañar sus datos con Python. Si necesita una solución en varios idiomas, JSON es definitivamente una mejor opción. Y, finalmente, recuerde que los pickles pueden usarse para llevar el código que no necesariamente quiere ejecutar. De manera similar a la comida en escabeche, siempre que obtenga sus encurtidos de fuentes confiables, debería estar bien.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas