Поглиблений курс розробки на 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 як аргументи для перевірки розмірів стиснення та завершення рівня.