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 като аргументи, за да потвърдите размерите след компресиране и да завършите нивото.

Книга с Код