Курс розробки на 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, зберігши довжину red_compression .

Коли обидві змінні заповнені, використайте заздалегідь написану функцію write() та передайте їй message_length та compression_length як аргументи, щоб перевірити розміри до й після стискання. Це демонструє, наскільки файл стислося порівняно з тим, коли він не стиснутий.

Підійдіть до темної позначки X над синім килимом і станьте обличчям до комп’ютера. Створіть змінну blue_bytes і конвертуйте blue_message у байти за допомогою функції bytes() так само, як ви це зробили з red_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 як аргументи, щоб перевірити розмір стиснення та завершити рівень.

Книга Коду