Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň

Serializační moduly
Komprimační moduly

Cíl

Vezměte zprávy a objednávky a komprimujte je pro archivaci a přenos.

K dispozici je několik stavebních pokynů, zásilek a manifestů, které byly odeslány a je třeba je přenést nebo archivovat. Ačkoli lze vše odeslat ručně, dobrým způsobem je komprimovat a dekomprimovat soubory a poté je uložit nebo odeslat. K tomu můžete použít moduly pro kompresi, které zmenší velikost souborů a usnadní správu informací. Na rozdíl od jiných problémů, které jsme řešili a při nichž jsme se naučili používat pouze jeden modul, máme k dispozici několik modulů pro kompresi se sadou základních funkcí. Jsou následující:

Pro rychlou kompresi s nízkým stupněm komprese použijte modul zlib přidáním import zlib. Pro naše účely budeme používat následující funkci: zlib.compress(), která přijímá jeden argument – data, jež chcete komprimovat. Argument musí být zadán jako bajty, nikoli jako řetězec.

Pro střední rychlost a střední stupeň komprese použijte modul bz2 přidáním import bz2. Pro naše účely budeme používat tyto funkce:

  • bz2.compress(), přijímá jeden argument – data, která chcete komprimovat.
  • bz2.decompress(), přijímá jeden argument – data, která chcete dekomprimovat. Musí být zadána jako bajty, nikoli jako řetězec.

Argumenty musí být zadány jako bajty, nikoli jako řetězec.

Pro vysokou kompresi, ale pomalou rychlost použijte modul lzma přidáním import lzma. Pro naše účely budeme používat následující třídy a funkce:

  • lzma.LZMACompressor(): třída používaná k vytvoření objektu kompresoru, který umožňuje kompresi dat.
  • compress(): přijímá jeden argument – data, která chcete komprimovat. Musí být zadána jako bajty, nikoli jako řetězec. Argument musí být zadán jako bajty, nikoli jako řetězec.

Kromě těchto modulů budeme používat funkci bytes(), která umožňuje převést řetězce na bajty, což je užitečné pro kompresi. Funkce přijímá dva argumenty: řetězec, který chcete převést, a formát, který je pro naše účely 'utf-8'.

Existují tři konstanty obsahující data, která je třeba komprimovat. Jsou pojmenovány red_message, blue_message a green_message.

Nejprve se vydejte k zlatému X na červeném koberci a vytvořte proměnnou red_bytes. Vezměte konstantu red_message a převedete zprávu na bajty, aby bylo možné data komprimovat, pomocí funkce bytes() s formátem 'utf-8', například takto: red_bytes = bytes(red_message, 'utf-8').

Vytvořte proměnnou red_compression a uložte do ní hodnotu zlib.compress(). Použijte red_bytes jako argument, který data zkomprimuje, například takto: red_compression = zlib.compress(red_bytes). Jakmile budou data zkomprimována, použijte předpřipravenou funkci display() v editoru kódu a přidejte proměnné red_message a red_compression jako argumenty, abyste zobrazili zprávu a informace o kompresi.

Přejděte k světlému X na červeném koberci a postavte se ke stolu. Vytvořte dvě proměnné: message_length a compression_length. V těchto proměnných budeme uchovávat počet znaků dat před a po kompresi pomocí funkce len(). Například pro message_length získáte délku red_message takto: message_length = len(red_message). Stejně tak pro compression_length uložíte délku red_compression.

Jakmile budou obě proměnné naplněny, použijte předpřipravenou funkci write() a vložte message_length a compression_length jako argumenty, abyste ověřili velikosti před a po kompresi. To ukazuje, o kolik je soubor zmenšen oproti nekomprimované podobě.

Přejděte k tmavému X na modrém koberci a postavte se k počítači. Vytvořte proměnnou blue_bytes a převedete blue_message na bajty pomocí funkce bytes() stejným způsobem jako u red_message. Vezměte konstantu blue_message a zkomprimujte ji tak, že do proměnné uložíte výsledek bz2.compress() s argumentem blue_bytes, například takto: blue_message = bz2.compress(blue_bytes).

Vytvořte proměnnou blue_decompress a uložte do ní výsledek bz2.decompress() s argumentem blue_message, abyste zobrazili data po dekompresi. Přidejte proměnné blue_message a blue_decompress do předpřipravené funkce display(), abyste viděli komprimovanou i dekomprimovanou podobu zprávy.

Přejděte k tmavému X na zeleném koberci a vytvořte objekt compressor, do kterého uložíte lzma.LZMACompressor(). Tímto se vytvoří objekt kompresoru, který lze použít s funkcemi lzma. Vytvořte proměnnou green_bytes a převeďte green_message na bajty pomocí funkce bytes(), stejným způsobem jako u red_message a blue_message.

Vytvořte proměnnou green_compression a uložte do ní výsledek volání compressor.compress() s argumentem green_bytes. To vám umožní komprimovat data zprávy pomocí objektu kompresoru. Do předpřipravené funkce display() přidejte proměnné green_message a green_compression jako argumenty, abyste viděli zprávu a zkomprimovaná data.

Přejděte k světlému X na zeleném koberci a postavte se ke stolu. Upravte dvě proměnné pojmenované message_length a compression_length. V těchto proměnných budeme uchovávat počet znaků dat před a po kompresi pomocí funkce len(). Pro message_length získáte délku green_message pomocí len(). Stejně tak pro compression_length uložte délku green_compression. Jakmile budou obě proměnné naplněny, použijte předpřipravenou funkci write() a vložte message_length a compression_length jako argumenty, abyste ověřili velikosti před a po kompresi a dokončili úroveň.

Kniha Kódu