Coding for KidsCoding for Kids
Креативні РівніВикликиПосібник для Вчителів
Голосувати за функції
Поглиблений курс розробки на 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 як аргументи для перевірки розмірів стиснення та завершення рівня.

Книга Коду