Avancerad Pythonutvecklingskurs
Kapitel
>
Nivå

Serialiseringsmoduler
Komprimeringsmoduler

Mål

Ta meddelanden och order och komprimera dem för arkivering och överföring.

Det finns flera konstruktionsinstruktioner, leveranser och manifester som har skickats in och behöver överföras eller arkiveras. Även om dessa kan skickas manuellt är ett bra sätt att göra detta att komprimera och dekomprimera filer för att sedan lagra eller skicka dem vidare. För att göra detta kan du använda komprimeringsmoduler för att minska filstorlekar och göra informationen lättare att hantera. Till skillnad från andra problem vi löst där vi lärde oss och använde en modul finns det flera komprimeringsmoduler vi kan använda med ett begränsat urval av funktioner. Dessa är följande:

För snabb komprimeringshastighet och låg komprimeringsgrad, använd modulen zlib genom att lägga till import zlib. För våra ändamål kommer vi att använda följande funktion: zlib.compress(), som tar ett argument, nämligen den information du vill komprimera. Argumentet måste anges som bytes istället för som en sträng.

För medelhög komprimeringshastighet och medelhög komprimeringsgrad, använd modulen bz2 genom att lägga till import bz2. För våra ändamål kommer vi att använda följande funktioner:

  • bz2.compress(), tar ett argument, nämligen den information du vill komprimera.
  • bz2.decompress(), tar ett argument, nämligen den information du vill dekomprimera.

Argumenten måste anges som bytes istället för som en sträng.

För hög komprimering men långsam komprimeringshastighet, använd modulen lzma genom att lägga till import lzma. För våra ändamål kommer vi att använda följande klasser och funktioner:

  • lzma.LZMACompressor(): Klass som används för att skapa komprimeringsobjekt som låter dig initiera en kompressor.
  • compress(): tar ett argument, nämligen den information du vill komprimera. Argumentet måste anges som bytes istället för som en sträng.

Argumentet måste anges som bytes istället för som en sträng.

Utöver dessa moduler kommer vi att använda funktionen bytes(), som låter dig omvandla strängar till bytes, vilket är användbart för komprimering. Den tar två argument: strängen du vill omvandla och formatet, vilket för våra ändamål är 'utf-8'.

Det finns tre konstanter som innehåller data som behöver komprimeras, vilka heter red_message, blue_message och green_message. Börja med att gå till den gyllene X-markeringen över den röda mattan och skapa en variabel med namnet red_bytes. Ta konstanten red_message och omvandla meddelandet till bytes så att data kan komprimeras genom att använda funktionen bytes() formaterad till 'utf-8', så här: red_bytes = bytes(red_message, 'utf-8').

Skapa en variabel med namnet red_compression och tilldela värdet av zlib.compress(). Använd red_bytes som argument för att komprimera datan, så här: red_compression = zlib.compress(red_bytes). När datan har komprimerats, använd den förskrivna funktionen display() i kodeditorn och lägg till variablerna red_message och red_compression som argument för att läsa meddelandet och se komprimeringsdatan.

Gå till den ljusa X-markeringen över den röda mattan och vänd dig mot skrivbordet, skapa två variabler med namnen message_length och compression_length. I dessa variabler kommer vi att lagra antalet tecken i datan både före och efter komprimering genom att använda funktionen len(). Till exempel, för message_length hämtar du längden på red_message, så här: message_length = len(red_message). Gör på samma sätt för compression_length genom att lagra len()red_compression.

När båda variablerna har tilldelats, använd den förskrivna funktionen write() och sätt in message_length och compression_length som argument för att verifiera komprimeringsstorlekarna. Detta visar hur mycket filen är komprimerad i förhållande till när den är okomprimerad.

Gå till den mörka X-markeringen över den blå mattan och vänd dig mot datorn. Skapa en variabel med namnet blue_bytes och omvandla blue_message till bytes med funktionen bytes() på samma sätt som du gjorde med red_message. Ta konstanten blue_message och komprimera den genom att tilldela värdet av bz2.compress() och ange blue_bytes som argument för att komprimera datan, så här: blue_message = bz2.compress(blue_bytes).

Skapa en variabel med namnet blue_decompress och tilldela värdet av bz2.decompress() samt lägg till blue_message som argument för att visa datan efter dekomprimering. Lägg till variablerna blue_message och blue_decompress i den förskrivna funktionen display() för att visa den komprimerade och dekomprimerade varianten av meddelandedatan.

Gå till den mörka X-markeringen över den gröna mattan och skapa ett objekt med namnet compressor och tilldela det lzma.LZMACompressor(). Detta kommer att skapa ett komprimeringsobjekt som kan användas med lzma-funktioner. Skapa en variabel med namnet green_bytes och omvandla green_message till bytes med funktionen bytes() på samma sätt som du gjorde med red_message och blue_message.

Skapa en variabel med namnet green_compression och tilldela värdet av compressor.compress() med green_bytes som argument. Detta gör att du kan komprimera meddelandedatan med komprimeringsobjektet. I den förskrivna funktionen display() lägger du till variablerna green_message och green_compression som argument för att visa meddelandet och den komprimerade datan.

Gå till den ljusa X-markeringen över den gröna mattan och vänd dig mot skrivbordet, ändra de två variablerna med namnen message_length och compression_length. I dessa variabler kommer vi att lagra antalet tecken i datan både före och efter komprimering genom att använda funktionen len(). För message_length hämtar du längden på green_message med len(). Gör samma sak för compression_length genom att lagra len()green_compression. När båda variablerna har tilldelats, använd den förskrivna funktionen write() och sätt in message_length och compression_length som argument för att verifiera komprimeringsstorlekarna och slutföra nivån.

Kodbok