Curso de Desarrollo Avanzado en Python
Capítulo
>
Nivel
Módulos de serialización
Módulos Marshal y Pickle
Objetivo
Ir a la estación de servicio y asegurarte de que los datos se almacenen correctamente usando el módulo JSON para formatear archivos.
Siguiendo el camino, encontramos algunas estaciones que monitorizan la distribución de agua y la calidad del suelo de la tierra que se está desarrollando para una futura cosecha. Para procesar los datos, es eficiente serializarlos. Si bien usar JSON puede ser eficaz como solución general, también existen algunos métodos de serialización específicos de Python, que son los módulos Marshal y Pickle. El módulo Marshal está diseñado para una serialización/deserialización rápida convirtiendo los datos en binario, 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 e import pickle. Para nuestros propósitos, usaremos las siguientes funciones:
marshal.dumps(): Serializa datos en un formato binario, diseñado para la velocidad en Python. Toma un argumento, que es el dato que deseas serializar, y está limitado a tipos de datos básicos.marshal.loads(): Deserializa datos binarios en tipos de datos legibles por Python, con capacidades limitadas pero de ejecución rápida. Toma un argumento, que es el dato a deserializar.pickle.DEFAULT_PROTOCOL: Comprueba qué versión de protocolo de Pickle es la predeterminada en tu versión de Python. Los protocolos afectan cómo se serializan los datos.pickle.HIGHEST_PROTOCOL: Comprueba qué versión de protocolo de Pickle es la más alta disponible en tu versión de Python. Los protocolos afectan cómo se serializan los datos.pickle.dumps(): Serializa estructuras de datos complejas de Python en formato binario según el protocolo usado. Toma dos argumentos: los datos que deseas serializar y la versión de protocolo que deseas usar al serializar.pickle.loads(): Deserializa datos binarios en tipos de datos legibles por Python, con un alcance potente para objetos de Python. Toma un argumento, que es el dato que deseas deserializar.
Además de estos módulos y funciones, también utilizaremos un módulo de formateo llamado pformat, que importaremos usando from pprint import pformat. Esto nos permite usar la función pformat(), que se puede usar para formatear estructuras de datos como diccionarios, permitiéndonos mostrar la información de manera clara.
Para comenzar, camina hasta la marca X clara dentro de la pequeña estación de monitoreo y sitúate frente al terminal del ordenador. La estación monitoriza la presión del agua y las condiciones del suelo del terreno cercano que se está desarrollando para la siembra de cultivos. Hay una constante llamada reading; esta contiene datos de Python recopilados por la estación.
Crea una variable llamada data y almacena el valor de la función marshal.dumps() pasando reading como argumento. Así: data = marshal.dumps(reading). Usa la variable data con la función preescrita display() para ver los datos serializados de la variable.
Sal de la estación y dirígete a la marca X dorada; usa la función open() para abrir la puerta y acceder a la oficina. Camina hasta la marca X clara frente al terminal y deserializa los datos que acabas de serializar. Crea una variable llamada output y almacena el valor de marshal.loads() usando la variable data anterior como argumento. Usa la función write() y añade output como argumento para acceder a los datos serializados que recopilaste de la estación de monitoreo.
Camina hasta la marca X clara sobre la alfombra azul en la oficina; en el terminal verificaremos los protocolos para determinar qué tipo de serialización utilizará el módulo pickle al procesar los datos. En la función preescrita write(), establece los argumentos como pickle.DEFAULT_PROTOCOL y pickle.HIGHEST_PROTOCOL. Esto verificará cuál es el protocolo de serialización actual y cuál es el último protocolo de serialización disponible en este momento.
Avanza hasta la marca X oscura sobre la alfombra azul; ahora que hemos confirmado los protocolos, podemos verificar los datos almacenados. Se han recopilado y almacenado datos a lo largo de los meses en una constante llamada samples. Crea tres variables llamadas sereal_0, sereal_2 y sereal_5; las usaremos 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 nuevo con las características más complejas añadidas.
Almacenaremos el valor de pickle.dumps() estableciendo como argumentos la constante samples y el protocol correspondiente al número en el nombre de la variable. Por ejemplo, para sereal_0 estableceremos protocol=0, así: sereal_0 = pickle.dumps(samples, protocol=0). Usa sereal_0, sereal_2 y sereal_5 con la función preescrita display() para verificar cómo difiere la serialización para cada protocolo.
Camina hasta la marca X clara sobre la alfombra roja y sitúate frente al terminal; sobrescribe la variable output y almacena el valor de pickle.loads() estableciendo como argumento sereal_5 para deserializar los datos de muestra que se han recopilado hasta ahora. Usa la función display() y añade la función pformat() con la variable output para ver los datos. Así: await player.display(pformat(output)). Toma nota de las calificaciones de cada mes que se muestren en el terminal para que luego puedas registrarlas en un gráfico.
Camina hasta la marca X oscura sobre la alfombra roja y sitúate frente al escritorio; en la función preescrita write(), agrega las calificaciones que anotaste para cada mes, las cuales se mostraron previamente en el terminal. Agrégalas como cadenas con marcas "" en el orden correcto tal como se describen en la función para completar el nivel.