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

Книга с Код