Fortgeschrittener Python-Entwicklungskurs
Kapitel
>
Stufe
Serialisierungsmodule
Kompressionsmodule
Ziel
Nimm Nachrichten und Aufträge und komprimiere sie zum Archivieren und Übertragen.
Es gibt mehrere Bauanweisungen, Sendungen und Manifeste, die eingereicht wurden und übertragen oder archiviert werden müssen. Obwohl man alles auch manuell versenden kann, ist es viel effizienter, Dateien durch Komprimieren und Dekomprimieren zu verkleinern, bevor man sie speichert oder versendet. Dafür kann man Komprimierungs-Module verwenden, um Dateigrößen zu reduzieren und Informationen leichter zu verwalten. Im Gegensatz zu anderen Aufgaben, in denen wir ein einzelnes Modul kennengelernt und verwendet haben, stehen uns hier mehrere Komprimierungs-Module mit einer kleinen Auswahl an Funktionen zur Verfügung. Diese sind wie folgt:
Für schnelle Komprimierungsgeschwindigkeit und geringe Kompression verwendest du das Modul zlib, indem du import zlib hinzufügst. Für unsere Zwecke werden wir die folgende Funktion verwenden: zlib.compress(). Sie benötigt ein Argument, nämlich die Daten, die du komprimieren möchtest. Das Argument muss als Bytes statt als String übergeben werden.
Für mittlere Komprimierungsgeschwindigkeit und mittlere Kompressionsrate verwendest du das Modul bz2, indem du import bz2 hinzufügst. Für unsere Zwecke verwenden wir die folgenden Funktionen:
bz2.compress()benötigt ein Argument, nämlich die Daten, die du komprimieren möchtest.bz2.decompress()benötigt ein Argument, nämlich die zu dekomprimierenden Daten. Es muss als Bytes statt als String übergeben werden.
Argumente müssen als Bytes statt als String übergeben werden.
Für hohe Kompression bei geringer Geschwindigkeit verwendest du das Modul lzma, indem du import lzma hinzufügst. Für unsere Zwecke verwenden wir die folgenden Klassen und Funktionen:
lzma.LZMACompressor(): Klasse, mit der Kompressionsobjekte erzeugt werden, um einen Kompressor zu aktivieren.compress()benötigt ein Argument, nämlich die zu komprimierenden Daten. Sie müssen als Bytes statt als String übergeben werden.
Zusätzlich zu diesen Modulen verwenden wir die Funktion bytes(), mit der du Strings in Bytes umwandeln kannst, was für die Komprimierung nützlich ist. Sie nimmt zwei Argumente entgegen: den String, den du umwandeln möchtest, und das Format, das für unsere Zwecke 'utf-8' ist.
Es gibt drei Konstanten mit Daten, die komprimiert werden müssen: red_message, blue_message und green_message. Gehe zunächst zum goldenen X auf dem roten Teppich und erstelle eine Variable namens red_bytes. Nimm die Konstante red_message und wandle die Nachricht in Bytes um, damit die Daten komprimiert werden können, indem du die Funktion bytes() mit dem Format 'utf-8' verwendest, zum Beispiel: red_bytes = bytes(red_message, 'utf-8').
Erstelle eine Variable namens red_compression und speichere den Wert von zlib.compress(). Verwende red_bytes als Argument, damit die Daten komprimiert werden, zum Beispiel: red_compression = zlib.compress(red_bytes). Sobald die Daten komprimiert sind, verwende die vorgefertigte Funktion display() im Code-Editor und übergebe die Variablen red_message und red_compression als Argumente, um die Nachricht anzuzeigen und die Komprimierungsdaten zu sehen.
Gehe zum hellen X auf dem roten Teppich und richte dich zum Schreibtisch. Erstelle zwei Variablen namens message_length und compression_length. In diesen Variablen speichern wir die Zeichenlänge der Daten vor und nach der Kompression mit der Funktion len(). Zum Beispiel für message_length: ermittle die Länge von red_message, zum Beispiel: message_length = len(red_message). Mach dasselbe für compression_length, indem du die len() von red_compression speicherst.
Sobald beide Variablen befüllt sind, verwende die vorgefertigte Funktion write() und übergebe message_length und compression_length als Argumente, um die Komprimierungsgrößen zu überprüfen. Dies zeigt, wie stark die Datei im Vergleich zum unkomprimierten Zustand verkleinert wurde.
Gehe zum dunklen X auf dem blauen Teppich und richte dich zum Computer. Erstelle eine Variable namens blue_bytes und wandle blue_message mit der Funktion bytes() auf die gleiche Weise wie bei red_message in Bytes um.Nimm die Konstante blue_message und komprimiere sie, indem du den Wert von bz2.compress() speicherst und blue_bytes als Argument übergibst, zum Beispiel: blue_message = bz2.compress(blue_bytes).
Erstelle eine Variable namens blue_decompress und speichere den Wert von bz2.decompress(), wobei du blue_message als Argument übergibst, um die Daten nach der Dekompression anzusehen. Füge die Variablen blue_message und blue _decompress der vorgefertigten Funktion display() hinzu, um komprimierte und dekomprimierte Versionen der Nachrichtendaten anzuzeigen.
Begebe dich zum dunklen X auf dem grünen Teppich und erstelle ein Objekt namens compressor und initialisiere es mit lzma.LZMACompressor(). Dadurch wird ein Kompressorobjekt erzeugt, das mit Funktionen von lzma verwendet werden kann. Erstelle eine Variable namens green_bytes und wandle green_message mit der Funktion bytes() im gleichen Stil wie bei red_message und blue message in Bytes um.
Erstelle eine Variable namens green_compression und speichere compressor.compress() als Wert, indem du green_bytes übergibst. Dadurch kannst du die Nachrichtendaten mit dem Kompressorobjekt komprimieren. Füge der vorgefertigten Funktion display() die Variablen green_message und green_compression als Argumente hinzu, um die Nachricht und die komprimierten Daten anzuzeigen.
Gehe zum hellen X auf dem grünen Teppich und richte dich zum Schreibtisch, ändere die beiden Variablen message_length und compression_length. In diesen Variablen speichern wir die Zeichenlänge der Daten vor und nach der Kompression mit der Funktion len(). Für message_length ermittle die Länge von green_message mit len(). Mach dasselbe für compression_length, indem du die len() von green_compression speicherst. Sobald beide Variablen befüllt sind, verwende die vorgefertigte Funktion write() und übergebe message_length und compression_length als Argumente, um die Komprimierungsgrößen zu überprüfen und die Aufgabe abzuschließen.