Продвинутый курс разработки на Python
Глава
>
Уровень

Модули сериализации
Модули сжатия

Цель

Берите сообщения и приказы и сжимайте их для архивирования и передачи.

Есть несколько инструкций по строительству, отправок и манифестов, которые были поданы и нуждаются в передаче или архивировании. Хотя их можно отправить вручную, хороший способ — это сжать и распаковать файлы, а затем сохранить или отправить их. Для этого можно использовать модули сжатия, чтобы уменьшить размер файлов и упростить управление информацией. В отличие от других задач, где мы изучали и использовали один модуль, здесь доступно несколько модулей сжатия с небольшим набором функций. Они следующие:

Для быстрой скорости сжатия и низкого уровня сжатия используйте модуль zlib, добавив import zlib. Для наших целей мы будем использовать следующую функцию: zlib.compress(), которая принимает один аргумент — информацию, которую вы хотите сжать. Аргумент должен передаваться в виде байтов, а не строки.

Для средней скорости сжатия и среднего уровня сжатия используйте модуль bz2, добавив import bz2. Для наших целей мы будем использовать следующие функции:

  • bz2.compress(), принимает один аргумент — информацию, которую вы хотите сжать.
  • bz2.decompress(), принимает один аргумент — информацию, которую вы хотите распаковать.

Аргументы должны передаваться в виде байтов, а не строки.

Для высокого уровня сжатия, но медленной скорости используйте модуль lzma, добавив import lzma. Для наших целей мы будем использовать следующие классы и функции:

  • lzma.LZMACompressor(): класс для создания объектов сжатия, позволяющий активировать компрессор.
  • compress(): принимает один аргумент — информацию, которую вы хотите сжать. Аргумент должен передаваться в виде байтов, а не строки.

В дополнение к этим модулям мы будем использовать функцию bytes(), которая позволяет преобразовывать строки в байты, что полезно для сжатия. Она принимает два аргумента: строку, которую нужно преобразовать, и формат, который для наших целей — 'utf-8'.

Существует три константы с данными, которые нужно сжать: red_message, blue_message и green_message. Чтобы начать, подойдите к золотому знаку X над красным ковром и создайте переменную red_bytes. Возьмите константу red_message и преобразуйте сообщение в байты, чтобы данные можно было сжать, используя функцию bytes() с форматом 'utf-8', например: red_bytes = bytes(red_message, 'utf-8').

Создайте переменную red_compression и сохраните в ней результат вызова zlib.compress(). Используйте red_bytes в качестве аргумента, чтобы сжать данные, например: red_compression = zlib.compress(red_bytes). После сжатия данных вызовите заранее написанную функцию display() в редакторе кода и передайте ей переменные red_message и red_compression в качестве аргументов, чтобы прочитать сообщение и просмотреть данные сжатия.

Подойдите к светлому знаку X над красным ковром и встаньте лицом к столу, создайте две переменные: message_length и compression_length. В этих переменных мы будем хранить длину данных до и после сжатия с помощью функции len(). Например, для message_length получите длину red_message, так: message_length = len(red_message). Сделайте то же самое для compression_length, сохранив len(red_compression).

Когда обе переменные будут заполнены, вызовите заранее написанную функцию write() и передайте ей аргументы message_length и compression_length, чтобы проверить размеры сжатия. Это демонстрирует, насколько файл уменьшился относительно исходного.

Подойдите к темному знаку X над синим ковром, встаньте лицом к компьютеру. Создайте переменную blue_bytes и преобразуйте blue_message в байты с помощью функции bytes() так же, как с red_message. Возьмите константу blue_message и сожмите её, сохранив результат bz2.compress() и передав blue_bytes в качестве аргумента, например: blue_message = bz2.compress(blue_bytes).

Создайте переменную blue_decompress и сохраните в ней результат вызова bz2.decompress(), передав ему blue_message в качестве аргумента, чтобы получить данные после распаковки. Добавьте переменные blue_message и blue_decompress в заранее написанную функцию display(), чтобы просмотреть сжатые и распакованные варианты данных сообщения.

Отправляйтесь к темному знаку X над зелёным ковром и создайте объект compressor, заполнив его lzma.LZMACompressor(). Это создаст объект компрессора, который можно использовать с функциями lzma. Создайте переменную green_bytes и преобразуйте green_message в байты с помощью функции bytes() так же, как вы это делали с red_message и blue_message.

Создайте переменную green_compression и сохраните в ней результат compressor.compress(), передав green_bytes в качестве аргумента. Это позволит сжать данные сообщения с помощью объекта компрессора. В заранее написанную функцию display() добавьте переменные green_message и green_compression, чтобы просмотреть сообщение и данные сжатия.

Подойдите к светлому знаку X над зелёным ковром и встаньте лицом к столу, измените две переменные: message_length и compression_length. В этих переменных мы будем хранить длину данных до и после сжатия с помощью функции len(). Для message_length получите длину green_message, используя len(). Сделайте то же для compression_length, сохранив len(green_compression). Когда обе переменные будут заполнены, вызовите заранее написанную функцию write() и передайте ей аргументы message_length и compression_length, чтобы проверить размеры сжатия и завершить уровень.

Книга Кода