Coding for KidsCoding for Kids
Poziomy KreatywneWyzwaniaPrzewodnik dla Nauczycieli
Głosuj na funkcje
Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom

Moduły serializacji
Moduły kompresji

Cel

Weź wiadomości i zamówienia oraz skompresuj je do archiwizacji i transmisji.

Istnieje kilka instrukcji budowy, przesyłek i listów przewozowych, które zostały dostarczone i muszą zostać przekazane lub zarchiwizowane. Choć można je wysyłać ręcznie, dobrym sposobem jest kompresja i dekompresja plików, a następnie ich przechowywanie lub wysyłka. Aby to zrobić, możesz użyć modułów kompresji, aby zmniejszyć rozmiary plików i ułatwić zarządzanie informacjami. W przeciwieństwie do innych problemów, które rozwiązaliśmy, gdzie poznaliśmy i używaliśmy jednego modułu, tutaj mamy do wyboru kilka modułów kompresji z niewielkim zbiorem funkcji. Są one następujące:

Dla szybkiej prędkości kompresji przy niskim stopniu kompresji, użyj modułu zlib, dodając import zlib. Do naszych celów będziemy używać następującej funkcji: zlib.compress(), która przyjmuje jeden argument, którym jest informacja, którą chcesz skompresować. Argument musi być wprowadzony jako bajty zamiast ciągu znaków.

Dla średniej prędkości kompresji i średniego stopnia kompresji, użyj modułu bz2, dodając import bz2. Do naszych celów będziemy używać następujących funkcji:

  • bz2.compress(), która przyjmuje jeden argument, którym jest informacja, którą chcesz skompresować.
  • bz2.decompress(), która przyjmuje jeden argument, którym jest informacja, którą chcesz dekompresować. Argument musi być wprowadzony jako bajty zamiast ciągu znaków.

Argumenty muszą być podane jako bajty zamiast ciągu znaków.

Dla wysokiego stopnia kompresji, ale przy niskiej prędkości, użyj modułu lzma, dodając import lzma. Do naszych celów będziemy używać następujących klas i funkcji:

  • lzma.LZMACompressor(): Klasa używana do tworzenia obiektów kompresji, która umożliwia aktywację kompresora.
  • compress(): przyjmuje jeden argument, którym jest informacja, którą chcesz skompresować. Argument musi być wprowadzony jako bajty zamiast ciągu znaków.

Oprócz tych modułów, będziemy używać funkcji bytes(), która pozwala konwertować ciągi znaków na bajty, co będzie przydatne przy kompresji. Funkcja przyjmuje dwa argumenty: ciąg znaków, który chcesz przekonwertować, oraz format, którym dla naszych celów jest 'utf-8'.

Istnieją trzy stałe zawierające dane, które należy skompresować, o nazwach red_message, blue_message oraz green_message. Na początek przejdź do złotego znaku X nad czerwonym dywanem, utwórz zmienną o nazwie red_bytes. Weź stałą red_message i przekonwertuj wiadomość na bajty, aby dane mogły być skompresowane, używając funkcji bytes() ustawionej na 'utf-8', w następujący sposób: red_bytes = bytes(red_message, 'utf-8').

Utwórz zmienną o nazwie red_compression i przypisz jej wartość funkcji zlib.compress(). Użyj red_bytes jako argumentu, który skompresuje dane, w następujący sposób: red_compression = zlib.compress(red_bytes). Gdy dane zostaną skompresowane, użyj predefiniowanej funkcji display() w edytorze kodu i dodaj zmienne red_message oraz red_compression jako argumenty, aby odczytać wiadomość i zobaczyć dane dotyczące kompresji.

Przejdź do jasnego znaku X nad czerwonym dywanem i stan przed biurkiem, utwórz dwie zmienne o nazwach: message_length i compression_length. W tych zmiennych będziemy przechowywać długość danych (liczbę znaków) zarówno przed, jak i po kompresji, używając funkcji len(). Na przykład, dla message_length pobierz długość red_message, w następujący sposób: message_length = len(red_message). Zrób to samo dla compression_length, zapisując len(red_compression).

Gdy obie zmienne zostaną zapełnione, użyj predefiniowanej funkcji write() i wstaw zmienne message_length oraz compression_length jako argumenty, aby zweryfikować rozmiary kompresji. To pokazuje, o ile plik został skompresowany w porównaniu do sytuacji, gdy pozostaje nieskompresowany.

Przejdź do ciemnego znaku X nad niebieskim dywanem, stan przed komputerem. Utwórz zmienną o nazwie blue_bytes i przekonwertuj blue_message na bajty, używając funkcji bytes() w taki sam sposób, jak zrobiłeś to z red_message. Weź stałą blue_message i skompresuj ją, przypisując wartość bz2.compress() i przekazując blue_bytes jako argument, w następujący sposób: blue_message = bz2.compress(blue_bytes).

Utwórz zmienną o nazwie blue_decompress i zapisz w niej wartość funkcji bz2.decompress(), dodając blue_message jako argument, aby zobaczyć dane po dekompresji. Dodaj zmienne blue_message oraz blue_decompress do predefiniowanej funkcji display(), aby zobaczyć skompresowane i zdekompresowane warianty danych wiadomości.

Przejdź do ciemnego znaku X nad zielonym dywanem i utwórz obiekt o nazwie compressor, przypisując mu wartość lzma.LZMACompressor(). Utworzy to obiekt kompresora, który może być używany z funkcjami lzma. Utwórz zmienną o nazwie green_bytes i przekonwertuj green_message na format bajtów, używając funkcji bytes() w taki sam sposób, jak zrobiłeś to z red_message oraz blue_message.

Utwórz zmienną o nazwie green_compression i przypisz jej wartość funkcji compressor.compress(), przekazując green_bytes jako argument. Pozwoli to skompresować dane wiadomości przy użyciu obiektu kompresora. W predefiniowanej funkcji display() dodaj zmienne green_message oraz green_compression jako argumenty, aby zobaczyć wiadomość i skompresowane dane.

Przejdź do jasnego znaku X nad zielonym dywanem i stan przed biurkiem, zmodyfikuj dwie zmienne o nazwach: message_length i compression_length. W tych zmiennych będziemy przechowywać długość danych (liczbę znaków) zarówno przed, jak i po kompresji, używając funkcji len(). Dla message_length pobierz długość green_message za pomocą len(). Zrób to samo dla compression_length, zapisując len(green_compression). Gdy obie zmienne zostaną zapełnione, użyj predefiniowanej funkcji write() i wstaw zmienne message_length oraz compression_length jako argumenty, aby zweryfikować rozmiary kompresji i ukończyć poziom.

Księga Kodów