Curso de Desarrollo Avanzado en Python
Capítulo
>
Nivel
Módulos de Serialización
Módulos de compresión
Objetivo
Tomar mensajes y pedidos y comprimirlos para archivarlos y transmitirlos.
Hay varias instrucciones de construcción, envíos y manifiestos que se han enviado y necesitan transferirse o archivarse. Aunque se pueden enviar manualmente todos los archivos, una buena forma de hacerlo es comprimiendo y descomprimiendo archivos antes de almacenarlos o enviarlos. Para ello, puedes usar módulos de compresión para reducir el tamaño de los archivos y facilitar la gestión de la información. A diferencia de otros problemas que resolvimos donde aprendimos y usamos un único módulo, existen varios módulos de compresión que podemos usar con una pequeña selección de funciones. Estos son los siguientes:
Para una velocidad de compresión rápida y una compresión baja, utiliza el módulo zlib, agregando import zlib. Para nuestros propósitos usaremos la siguiente función: zlib.compress(), que utiliza un argumento, la información que deseas comprimir. El argumento debe ingresarse como bites en lugar de una cadena.
Para una velocidad de compresión media y una compresión media, utiliza el módulo bz2, agregando import bz2. Para nuestros propósitos usaremos las siguientes funciones:
bz2.compress(), que utiliza un argumento, la información que deseas comprimir.bz2.decompress(), que utiliza un argumento, la información que deseas comprimir. Debe ingresarse como bites en lugar de una cadena.
Los argumentos deben ingresarse como bites en lugar de una cadena.
Para una alta compresión pero con velocidad de compresión lenta, utiliza el módulo lzma, agregando import lzma. Para nuestros propósitos usaremos las siguientes clases y funciones:
lzma.LZMACompressor(): clase utilizada para crear objetos de compresión que te permiten activar un compresor.compress(): utiliza un argumento, la información que deseas comprimir. Debe ingresarse como bites en lugar de una cadena. El argumento debe ingresarse como bites en lugar de una cadena.
Además de estos módulos, utilizaremos la función bytes(), que te permite convertir cadenas en bytes, lo cual será útil para comprimir. Toma dos argumentos: la cadena que deseas convertir y el formato, que para nuestros propósitos es 'utf-8'.
Hay tres constantes que contienen datos que necesitan ser comprimidos, llamadas red_message, blue_message y green_message. Para comenzar, dirígete a la marca X dorada sobre la alfombra roja y crea una variable llamada red_bytes. Toma la constante red_message y convierte el mensaje en bytes para que los datos puedan comprimirse, usando la función bytes() con formato 'utf-8', así: red_bytes = bytes(red_message, 'utf-8').
Crea una variable llamada red_compression y almacena el valor de zlib.compress(). Usa red_bytes como argumento para comprimir los datos, así: red_compression = zlib.compress(red_bytes). Una vez que los datos se hayan comprimido, usa la función predefinida display() en el editor de código y agrega las variables red_message y red_compression como argumentos para leer el mensaje y ver los datos de compresión.
Dirígete a la marca X clara sobre la alfombra roja y enfréntate al escritorio, crea dos variables llamadas message_length y compression_length. En estas variables almacenaremos la longitud de caracteres de los datos antes y después de la compresión usando la función len(). Por ejemplo, para message_length obtén la longitud de red_message, así: message_length = len(red_message). Haz lo mismo para compression_length almacenando len(red_compression).
Una vez que ambas variables estén pobladas, usa la función predefinida write() e inserta message_length y compression_length como argumentos para verificar los tamaños de compresión. Esto demuestra cuánto se comprime el archivo en comparación con cuando está sin comprimir.
Dirígete a la marca X oscura sobre la alfombra azul y enfréntate al ordenador. Crea una variable llamada blue_bytes y convierte blue_message en bytes usando la función bytes() de la misma manera que lo hiciste con red_message. Toma la constante blue_message y comprímela almacenando el valor de bz2.compress() e insertando blue_bytes como argumento para comprimir los datos, así: blue_message = bz2.compress(blue_bytes).
Crea una variable llamada blue_decompress y almacena el valor de bz2.decompress() y agrega blue_message como argumento para ver los datos después de la descompresión. Agrega las variables blue_message y blue _decompress a la función predefinida display() para ver las variantes comprimidas y descomprimidas de los datos del mensaje.
Dirígete a la marca X oscura sobre la alfombra verde y crea un objeto llamado compressor y asígnale lzma.LZMACompressor(), esto creará un objeto compresor que puedes usar con funciones de lzma. Crea una variable llamada green_bytes y transforma green_message en formato bytes usando la función bytes() de la misma manera que lo hiciste con red_message y blue message.
Crea una variable llamada green_compression y almacena compressor.compress() como valor, agregando green_bytes como variable. Esto te permitirá comprimir los datos del mensaje usando el objeto compresor. En la función predefinida display() agrega las variables green_message y green_compression como argumentos para ver el mensaje y los datos comprimidos.
Dirígete a la marca X clara sobre la alfombra verde y enfréntate al escritorio, modifica las dos variables llamadas message_length y compression_length. En estas variables almacenaremos la longitud de caracteres de los datos antes y después de la compresión usando la función len(). Para message_length obtén la longitud de green_message con len(). Haz lo mismo para compression_length almacenando len(green_compression). Una vez que ambas variables estén pobladas, usa la función predefinida write() e inserta message_length y compression_length como argumentos para verificar los tamaños de compresión y finalizar el nivel.