Curso Avanzado de Desarrollo en Python
Capítulo
>
Nivel
Módulos de serialización
Módulos Marshal y Pickle
Objetivo
Dirígete a la estación de servicio y asegúrate de que los datos se almacenen correctamente utilizando el módulo JSON para formatear archivos.
Continuando por el camino, encontramos algunas estaciones que monitorean la distribución de agua y la calidad del suelo en el terreno que se está desarrollando para una futura cosecha. Para procesar los datos, es eficiente serializarlos. Si bien usar JSON puede ser efectivo como solución generalizada, también existen algunos métodos de serialización específicos de Python, siendo éstos los módulos Marshal y Pickle. El módulo Marshal está diseñado para la serialización/deserialización rápida al convertir los datos en binario, lo que lo hace ideal para transferencias de datos más simples. El módulo Pickle es más lento, pero está diseñado para procesar estructuras de datos más complejas y es mucho más flexible, ideal para estructuras de datos más grandes o prioritarias.
Para usar los módulos Marshal y Pickle, importa sus funciones escribiendo: import marshal y import pickle. Para nuestros propósitos, usaremos las siguientes funciones:
marshal.dumps(): Serializa datos a un formato binario, diseñado para la velocidad dentro de Python. Toma un argumento, que son los datos que deseas serializar, y está limitado a tipos de datos básicos.marshal.loads(): Deserializa datos binarios a tipos de datos legibles por Python, con capacidades limitadas pero de ejecución rápida. Toma un argumento, que son los datos a deserializar.pickle.DEFAULT_PROTOCOL: Verifica qué versión de protocolo para la serialización con Pickle es la predeterminada en tu versión de Python. Los protocolos afectan la forma en que se serializan los datos.pickle.HIGHEST_PROTOCOL: Verifica cuál es la versión de protocolo más alta disponible para la serialización con Pickle en tu versión de Python. Los protocolos afectan la forma en que se serializan los datos.pickle.dumps(): Serializa estructuras de datos complejas de Python en formato binario de acuerdo al protocolo usado. Toma dos argumentos, los datos que deseas serializar y la versión del protocolo que deseas usar al serializar.pickle.loads(): Deserializa datos binarios a tipos de datos legibles por Python, con un alcance poderoso para objetos de Python. Toma un argumento, que son los datos que deseas deserializar.
Además de estos módulos y funciones, también utilizaremos un módulo de formateo llamado pformat, el cual importaremos usando from pprint import pformat. Esto nos permite usar la función pformat() que se puede utilizar para formatear estructuras de datos como diccionarios, permitiéndonos mostrar la información de forma clara.
Para comenzar, camina hacia la marca en forma de X iluminada dentro de la pequeña estación de monitoreo y enfrenta el terminal de la computadora. La estación monitorea la presión del agua y las condiciones del suelo del terreno cercano que se está desarrollando para el cultivo de plantas. Existe una constante llamada reading, que contiene los datos de Python recogidos por la estación.
Crea una variable llamada data y almacena en ella el valor de la función marshal.dumps() estableciendo reading como argumento. De esta forma: data = marshal.dumps(reading). Utiliza la variable data con la función predefinida display() para ver los datos serializados de la variable.
Sal de la estación y dirígete a la marca en forma de X dorada, usa la función open() para abrir la puerta y acceder a la oficina. Camina hacia la marca en forma de X iluminada frente al terminal, y deserializa los datos que acabas de serializar. Crea una variable llamada output y almacena en ella el valor de marshal.loads() con la variable data anterior como argumento. Utiliza la función write() y añade output como argumento para acceder a los datos serializados recogidos de la estación de monitoreo.
Dirígete a la marca en forma de X iluminada sobre la alfombra azul en la oficina, en el terminal estaremos verificando los protocolos para determinar qué tipo de serialización utilizará el módulo Pickle al procesar los datos. En la función predefinida write(), establece los argumentos como pickle.DEFAULT_PROTOCOL y pickle.HIGHEST_PROTOCOL. Esto verificará cuál es el protocolo de serialización actual, así como el protocolo de serialización más reciente disponible en este momento.
Muévete hacia la marca en forma de X oscura sobre la alfombra azul, ahora que hemos confirmado los protocolos, podemos verificar los datos almacenados. Los datos han sido recogidos y almacenados a lo largo de los meses y se encuentran en una constante llamada samples. Crea tres variables llamadas: sereal_0, sereal_2 y sereal_5; usaremos estas para verificar tres de los protocolos disponibles para la serialización. El protocolo 0 es ASCII legible, no muy eficiente; el protocolo 2 es un formato binario más eficiente; y el protocolo 5 es el más reciente, con las características más complejas añadidas.
Almacenaremos el valor de pickle.dumps() y estableceremos como argumentos la constante samples y el protocol correspondiente al número en el nombre de la variable. Por ejemplo, para sereal_0 estableceremos el protocol como 0, de esta forma: sereal_0 = pickle.dumps(samples, protocol=0). Utiliza sereal_0, sereal_2 y sereal_5 con la función predefinida display() para verificar cuán diferente es la serialización para cada protocolo.
Dirígete a la marca en forma de X iluminada sobre la alfombra roja y enfrenta el terminal, sobrescribe la variable output y almacena en ella el valor de pickle.loads() estableciendo como argumento sereal_5, para deserializar los datos de muestra que se han reunido hasta el momento. Utiliza la función display() y añade la función pformat() con la variable output para ver los datos. De esta forma: await player.display(pformat(output)). Toma nota de las calificaciones de cada mes que se muestran en el terminal para luego registrarlas.
Dirígete a la marca en forma de X oscura sobre la alfombra roja y enfrenta el escritorio, en la función predefinida write(), añade las calificaciones que anotaste para cada mes, las cuales fueron mostradas anteriormente en el terminal. Añádelas como cadenas de texto entre comillas "" en el orden correcto tal como se detallan en la función para completar el nivel.