Haladó Python Fejlesztői Tanfolyam
Fejezet
>
Szint

Szerializációs modulok
Tömörítési modulok

Célkitűzés

Üzeneteket és megrendeléseket tömöríts archiválás és továbbítás céljából.

Több felépítési útmutató, szállítmány és manifesztum került benyújtásra, amelyeket át kell vinni vagy archiválni. Bár ezeket manuálisan is továbbíthatnánk, egy jó módszer a fájlok tömörítése és kicsomagolása, majd tárolása vagy kiküldése. Ehhez tömörítő modulokat használhatunk a fájlméret csökkentésére és az információk könnyebb kezelésére. Ellentétben más feladatokkal, ahol egyetlen modult tanultunk és használtunk, itt számos tömörítő modul közül választhatunk néhány alapvető funkcióval. A következők állnak rendelkezésre:

Gyors tömörítési sebesség és alacsony tömörítés esetén használd a zlib modult, az import zlib hozzáadásával. Számunkra a következő függvényt fogjuk használni: zlib.compress(), amely egy argumentumot használ, nevezetesen a tömöríteni kívánt adatot. Az argumentumot bájtok formájában kell megadni, nem stringként.

Közepes tömörítési sebesség és közepes tömörítés esetén használd a bz2 modult, az import bz2 hozzáadásával. Számunkra az alábbi függvényeket fogjuk használni:

  • bz2.compress(), egy argumentumot használ, ami a tömöríteni kívánt adat.
  • bz2.decompress(), egy argumentumot használ, ami a kicsomagolni kívánt adat. Az argumentumot bájtokként kell megadni, nem stringként.

Az argumentumokat bájtokként kell megadni, nem stringként.

Magas tömörítési arány, de lassú tömörítési sebesség esetén használd az lzma modult, az import lzma hozzáadásával. Számunkra az alábbi osztályokat és függvényeket használjuk:

  • lzma.LZMACompressor(): Olyan osztály, amivel tömörítő objektumokat lehet létrehozni, amelyek aktiválják a tömörítést.
  • compress(): egy argumentumot használ, ami a tömöríteni kívánt adat. Az argumentumot bájtokként kell megadni, nem stringként.

Ezen modulok mellett a bytes() függvényt is használjuk, amellyel stringeket alakíthatsz át bájtokká, ami a tömörítéshez hasznos. Két argumentuma van: az átalakítani kívánt string és a formátum, ami számunkra 'utf-8'.

Három konstans tartalmaz adatot, amit tömöríteni kell: red_message, blue_message és green_message.

Először is sétálj a piros szőnyeg feletti arany X jelhez, és hozz létre egy red_bytes nevű változót. Vedd a red_message konstansot, és a bytes() függvénnyel alakítsd át bájtokká 'utf-8' formátumban, így: red_bytes = bytes(red_message, 'utf-8').

Hozz létre egy red_compression nevű változót, és tárold benne a zlib.compress() értékét. Használd argumentumként a red_bytes-t, ami tömöríti az adatot, így: red_compression = zlib.compress(red_bytes). Miután az adat tömörítve lett, használd a kód szerkesztőben előre megírt display() függvényt, és add át neki argumentumként a red_message és red_compression változókat, hogy el tudd olvasni az üzenetet és meg tudd nézni a tömörített adatot.

Sétálj a piros szőnyeg feletti világos X jelhez, és fordulj a pulthoz. Hozz létre két változót message_length és compression_length néven. Ezekben a változókban a len() függvénnyel fogjuk eltárolni az adat karakterhosszát tömörítés előtt és után. Például a message_length esetén a red_message hosszát kapjuk meg így: message_length = len(red_message). Ugyanezt tedd meg a compression_length-el is a red_compression hosszának lekérdezésével.

Miután mindkét változó értéket kapott, használd a korábban megírt write() függvényt, és add át neki argumentumként a message_length-et és a compression_length-et, hogy ellenőrizd a tömörítés méretét. Ez megmutatja, mennyire csökkent a fájl mérete a tömörítés előttiekhez képest.

Sétálj a kék szőnyeg feletti sötét X jelhez, és fordulj a számítógép felé. Hozz létre egy blue_bytes nevű változót, és a bytes() függvénnyel alakítsd át a blue_message-t bájtokká ugyanúgy, ahogy a red_message-nél. A blue_message konstans tömörítéséhez tárold a bz2.compress() eredményét, argumentumként megadva a blue_bytes-t, így: blue_message = bz2.compress(blue_bytes).

Hozz létre egy blue_decompress nevű változót, és tárold benne a bz2.decompress() értékét, argumentumként megadva a blue_message-t, hogy lásd az adatot kicsomagolás után. Add hozzá a blue_message és blue_decompress változókat az előre írt display() függvényhíváshoz, hogy lásd az üzenet tömörített és kicsomagolt változatát.

Menj a zöld szőnyeg feletti sötét X jelhez, és hozz létre egy compressor nevű objektumot, és töltsd fel lzma.LZMACompressor()-ral, így létrehozva egy tömörítő objektumot, amelyet az lzma függvényekkel használhatsz. Hozz létre egy green_bytes nevű változót, és alakítsd át a green_message-t bájtokra a bytes() függvénnyel ugyanúgy, mint a red_message és blue_message esetén.

Hozz létre egy green_compression nevű változót, és tárold benne a compressor.compress() eredményét, argumentumként megadva a green_bytes-t. Ez lehetővé teszi az üzenet tömörítését a tömörítő objektummal. Add hozzá a green_message és green_compression változókat az előre írt display() függvényhíváshoz, hogy lásd az eredeti üzenetet és a tömörített adatot.

Sétálj a zöld szőnyeg feletti világos X jelhez, és fordulj a pulthoz, módosítsd a két message_length és compression_length nevű változót. Ezekben a változókban a len() függvénnyel tároljuk az adat karakterhosszát tömörítés előtt és után. A message_length esetén a green_message hosszát kapod meg len()-nel. Ugyanezt tedd a compression_length változóval is a green_compression hosszának lekérdezésével. Miután mindkét változó értéket kapott, használd az előírt write() függvényt, és add át neki argumentumként a message_length-et és compression_length-et a tömörítés méretének ellenőrzéséhez, ezzel befejezve a feladatot.

Kódkönyv