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