Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom

Moduły Serializacji
Moduły kompresji

Cel

Pobierz wiadomości i zamówienia i skompresuj je do archiwizacji i przesyłu.

Przekazano wiele instrukcji budowlanych, listów przewozowych i manifestów, które należy przekazać lub zarchiwizować. Choć można wysłać je ręcznie, dobrym sposobem jest kompresja i dekompresja plików przed ich przechowywaniem lub wysłaniem. W tym celu można użyć modułów kompresji, aby zmniejszyć rozmiar plików i ułatwić zarządzanie informacjami. W przeciwieństwie do innych rozwiązywanych przez nas problemów, w których używaliśmy jednego modułu, tutaj mamy kilka modułów kompresji z ograniczonym zestawem funkcji. Są one następujące:

Dla szybkiej kompresji i niskiego współczynnika kompresji użyj modułu zlib, dodając import zlib. W naszym przypadku będziemy używać następującej funkcji: zlib.compress(), która przyjmuje jeden argument – dane, które chcesz skompresować. Argument musi być przekazany jako bajty, a nie jako łańcuch znaków.

Dla średniej prędkości i średniego współczynnika kompresji użyj modułu bz2, dodając import bz2. W naszym przypadku będziemy używać następujących funkcji:

  • bz2.compress(), przyjmuje jeden argument – dane, które chcesz skompresować.
  • bz2.decompress(), przyjmuje jeden argument – dane, które chcesz zdekompresować. Muszą być przekazane jako bajty, a nie jako łańcuch znaków.

Argumenty muszą być przekazane jako bajty, a nie jako łańcuchy znaków.

Dla wysokiego stopnia kompresji, lecz wolnej prędkości, użyj modułu lzma, dodając import lzma. W naszym przypadku będziemy używać następujących klas i funkcji:

  • lzma.LZMACompressor(): klasa służąca do tworzenia obiektów kompresora, umożliwiająca kompresję danych.
  • compress(): używa jednego argumentu – danych, które chcesz skompresować. Muszą być przekazane jako bajty, a nie jako łańcuch znaków. Argument musi być przekazany jako bajty, a nie jako łańcuch znaków.

Oprócz tych modułów będziemy korzystać z funkcji bytes(), która pozwala na konwersję łańcucha znaków na bajty, co jest przydatne do kompresji. Przyjmuje dwa argumenty: łańcuch znaków do konwersji oraz format, którym w naszym przypadku jest 'utf-8'.

Są trzy stałe zawierające dane do skompresowania: red_message, blue_message oraz green_message. Na początek przejdź do złotej iksy nad czerwonym dywanem i utwórz zmienną red_bytes. Weź stałą red_message i przekonwertuj wiadomość na bajty, aby można było ją skompresować, używając funkcji bytes() z formatem 'utf-8', w ten sposób: red_bytes = bytes(red_message, 'utf-8').

Utwórz zmienną red_compression i przypisz do niej wynik wywołania zlib.compress(). Użyj red_bytes jako argumentu, co skompresuje dane, np.: red_compression = zlib.compress(red_bytes). Gdy dane zostaną skompresowane, użyj wbudowanej funkcji display() w edytorze kodu i przekaż jej jako argumenty zmienne red_message i red_compression, aby odczytać wiadomość i zobaczyć wynik kompresji.

Przejdź do jasnej iksy nad czerwonym dywanem i stań twarzą do biurka, utwórz dwie zmienne: message_length i compression_length. W tych zmiennych będziemy przechowywać długość danych przed i po kompresji za pomocą funkcji len(). Na przykład, dla message_length pobierz długość red_message, np.: message_length = len(red_message). To samo zrób dla compression_length, zapisując len(red_compression).

Gdy obie zmienne zostaną wypełnione, użyj wbudowanej funkcji write() i przekaż jej message_length i compression_length jako argumenty, aby zweryfikować rozmiary po kompresji. To pokaże, jak bardzo plik został skompresowany w porównaniu z wersją nieskompresowaną.

Przejdź do ciemnej iksy nad niebieskim dywanem i usiądź przy komputerze. Utwórz zmienną blue_bytes i przekonwertuj blue_message na bajty za pomocą funkcji bytes(), tak jak zrobiłeś to z red_message. Weź stałą blue_message i skompresuj ją, przypisując wynik bz2.compress() z blue_bytes jako argumentem, np.: blue_message = bz2.compress(blue_bytes).

Utwórz zmienną blue_decompress i przypisz do niej wynik bz2.decompress(), przekazując blue_message jako argument, aby zobaczyć dane po dekompresji. Dodaj zmienne blue_message i blue_decompress do wbudowanej funkcji display(), aby wyświetlić skompresowaną i zdekompresowaną wersję wiadomości.

Przejdź do ciemnej iksy nad zielonym dywanem i utwórz obiekt compressor, inicjalizując go za pomocą lzma.LZMACompressor(). Spowoduje to utworzenie obiektu kompresora, którego można użyć z funkcjami lzma. Utwórz zmienną green_bytes i przekształć green_message na format bajtowy za pomocą funkcji bytes() w taki sam sposób, jak zrobiłeś z red_message i blue_message.

Utwórz zmienną green_compression i przypisz do niej wynik compressor.compress(), przekazując green_bytes jako argument. Umożliwi to kompresję danych wiadomości za pomocą obiektu kompresora. Do wbudowanej funkcji display() dodaj zmienne green_message i green_compression jako argumenty, aby wyświetlić wiadomość i dane po kompresji.

Przejdź do jasnej iksy nad zielonym dywanem i stań twarzą do biurka. Zmodyfikuj dwie zmienne: message_length i compression_length. W tych zmiennych będziemy przechowywać długość danych przed i po kompresji za pomocą funkcji len(). Dla message_length pobierz długość green_message za pomocą len(). To samo zrób dla compression_length, zapisując len(green_compression). Gdy obie zmienne zostaną wypełnione, użyj wbudowanej funkcji write() i przekaż message_length i compression_length jako argumenty, aby zweryfikować rozmiary po kompresji i zakończyć poziom.

Księga Kodów