Geavanceerde Python-ontwikkelingscursus
Hoofdstuk
>
Niveau
Serialisatiemodules
Compressiemodules
Doelstelling
Neem berichten en orders en comprimeer ze voor archivering en verzending.
Er zijn verschillende bouwinstructies, zendingen en manifesten die zijn ingediend en moeten worden overgedragen of gearchiveerd. Hoewel deze handmatig verstuurd kunnen worden, is een goede manier om dit te doen door bestanden te comprimeren en decomprimeren en ze vervolgens op te slaan of te verzenden. Hiervoor kun je compressiemodules gebruiken om bestandsgroottes te verkleinen en informatie gemakkelijker te beheren. In tegenstelling tot andere problemen die we hebben opgelost waarbij we één module leerden en gebruikten, zijn er verschillende compressiemodules die we kunnen gebruiken met een kleine selectie functies. Ze zijn als volgt:
Voor een hoge compressiesnelheid en lage compressie, gebruik de zlib-module door import zlib toe te voegen. Voor ons doel gebruiken we de volgende functie: zlib.compress(), die één argument gebruikt, namelijk de informatie die je wilt comprimeren. Het argument moet worden ingevoerd als bytes in plaats van als string.
Voor een gemiddelde compressiesnelheid en gemiddelde compressie, gebruik de bz2-module door import bz2 toe te voegen. Voor ons doel gebruiken we de volgende functies:
bz2.compress(), gebruikt één argument, namelijk de informatie die je wilt comprimeren.bz2.decompress(), gebruikt één argument, namelijk de informatie die je wilt decompresseren. Het moet worden ingevoerd als bytes in plaats van als string.
Argumenten moeten worden ingevoerd als bytes in plaats van als string.
Voor hoge compressie maar trage compressiesnelheid, gebruik de lzma-module door import lzma toe te voegen. Voor ons doel gebruiken we de volgende klassen en functies:
lzma.LZMACompressor(): klasse die wordt gebruikt om compressie-objecten te maken, waarmee je een compressor kunt activeren.compress(): gebruikt één argument, namelijk de informatie die je wilt comprimeren. Het moet worden ingevoerd als bytes in plaats van als string. Argument moet worden ingevoerd als bytes in plaats van als string.
Naast deze modules gebruiken we de bytes()-functie, waarmee je strings kunt omzetten in bytes, wat nuttig is voor compressie. Deze neemt twee argumenten: de string die je wilt omzetten en het formaat, dat voor ons doel 'utf-8' is.
Er zijn drie constanten met gegevens die gecomprimeerd moeten worden, genaamd red_message, blue_message en green_message. Om te beginnen ga je naar het gouden X-teken op het rode tapijt en maak je een variabele genaamd red_bytes. Neem de constante red_message en zet het bericht om in bytes zodat de gegevens gecomprimeerd kunnen worden, door de bytes()-functie te gebruiken met het formaat 'utf-8', zoals dit: red_bytes = bytes(red_message, 'utf-8').
Maak een variabele met de naam red_compression en sla de waarde van zlib.compress() op. Gebruik red_bytes als argument om de gegevens te comprimeren, zoals dit: red_compression = zlib.compress(red_bytes). Zodra de gegevens zijn gecomprimeerd, gebruik je de vooraf geschreven display()-functie in de code-editor en voeg je de variabelen red_message en red_compression als argumenten toe om het bericht te lezen en de compressiegegevens te bekijken.
Loop naar het lichte X-teken op het rode tapijt en ga tegenover het bureau staan. Maak twee variabelen aan met de namen message_length en compression_length. In deze variabelen slaan we de tekenlengte van de gegevens op, zowel vóór als na compressie, met behulp van de len()-functie. Bijvoorbeeld, voor message_length haal je de lengte van red_message op, zo: message_length = len(red_message). Doe hetzelfde voor compression_length door de len() van red_compression op te slaan.
Zodra beide variabelen zijn gevuld, gebruik je de vooraf geschreven write()-functie en voeg je message_length en compression_length als argumenten toe om de compressiegroottes te verifiëren. Dit toont aan hoeveel het bestand is gecomprimeerd in vergelijking met wanneer het niet gecomprimeerd is.
Loop naar het donkere X-teken op het blauwe tapijt en ga achter de computer staan. Maak een variabele genaamd blue_bytes en zet blue_message om in bytes met de bytes()-functie op dezelfde manier als bij red_message. Neem de constante blue_message en comprimeer deze door de waarde van bz2.compress() op te slaan en blue_bytes als argument te gebruiken om de gegevens te comprimeren, zoals dit: blue_message = bz2.compress(blue_bytes).
Maak een variabele genaamd blue_decompress en sla de waarde van bz2.decompress() op met blue_message als argument om de gegevens na decompressie te bekijken. Voeg de variabelen blue_message en blue_decompress toe aan de vooraf geschreven display()-functie om de gecomprimeerde en gedecomprimeerde varianten van de berichtgegevens te bekijken.
Loop naar het donkere X-teken op het groene tapijt en maak een object genaamd compressor en initialiseer het met lzma.LZMACompressor(). Dit maakt een compressor-object dat gebruikt kan worden met lzma-functies. Maak een variabele genaamd green_bytes en zet green_message om in bytes met de bytes()-functie op dezelfde manier als bij red_message en blue_message.
Maak een variabele genaamd green_compression en sla compressor.compress() op, met green_bytes als argument. Hiermee kun je de berichtgegevens comprimeren met het compressor-object. Voeg in de vooraf geschreven display()-functie de variabelen green_message en green_compression als argumenten toe om het bericht en de gecomprimeerde gegevens te bekijken.
Loop naar het lichte X-teken op het groene tapijt en ga tegenover het bureau staan. Pas de twee variabelen message_length en compression_length aan. In deze variabelen slaan we de tekenlengte van de gegevens op, zowel vóór als na compressie, met behulp van de len()-functie. Voor message_length bepaal je de lengte van green_message met len(). Doe hetzelfde voor compression_length door de len() van green_compression op te slaan. Zodra beide variabelen zijn gevuld, gebruik je de vooraf geschreven write()-functie en voeg je message_length en compression_length als argumenten toe om de compressiegroottes te verifiëren en het level te voltooien.