Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom

Moduły serializacji
Moduły Marshal i Pickle

Cel

Udaj się na stację obsługi i upewnij się, że dane są prawidłowo zapisywane, używając modułu JSON do formatowania plików.

Kontynuując ścieżką, znajdujemy kilka stacji monitorujących rozprowadzanie wody i jakość gleby na terenie przygotowywanym pod przyszłe zbiory. Aby przetworzyć dane, efektywne jest ich serializowanie. Choć użycie JSON może być skutecznym rozwiązaniem ogólnym, istnieje również kilka specyficznych dla Pythona metod serializacji, a są to moduły Marshal i Pickle. Moduł Marshal jest zaprojektowany do szybkiej serializacji/deserializacji poprzez konwersję danych na format binarny, idealny do prostszych transferów danych. Moduł Pickle jest wolniejszy, ale zaprojektowany do przetwarzania bardziej złożonych struktur danych i jest znacznie bardziej elastyczny, idealny dla większych lub priorytetowych struktur danych.

Aby użyć modułów Marshal i Pickle, zaimportuj je, pisząc: import marshal oraz import pickle. Do naszych celów będziemy używać następujących funkcji:

  • marshal.dumps(): Serializuje dane do formatu binarnego, zaprojektowany pod kątem szybkości w Pythonie. Przyjmuje jeden argument — dane, które chcesz zserializować. Ograniczony do podstawowych typów danych.
  • marshal.loads(): Deserializuje dane binarne na typy danych czytelne dla Pythona, ograniczony pod względem możliwości, ale o szybkim działaniu. Przyjmuje jeden argument — dane do deserializacji.
  • pickle.DEFAULT_PROTOCOL: Sprawdza, która wersja protokołu serializacji Pickle jest domyślna w Twojej wersji Pythona. Protokoły wpływają na sposób serializacji danych.
  • pickle.HIGHEST_PROTOCOL: Sprawdza, która wersja protokołu serializacji Pickle jest najwyższa dostępna w Twojej wersji Pythona. Protokoły wpływają na sposób serializacji danych.
  • pickle.dumps(): Serializuje złożone struktury danych Pythona do formatu binarnego zgodnie z używanym protokołem. Przyjmuje dwa argumenty: dane do serializacji i wersję protokołu, której chcesz użyć.
  • pickle.loads(): Deserializuje dane binarne na typy danych czytelne dla Pythona, ma szerokie możliwości dla obiektów Pythona. Przyjmuje jeden argument — dane do deserializacji.

Ponadto będziemy również korzystać z modułu formatującego o nazwie pformat, który zaimportujemy za pomocą from pprint import pformat. Pozwala nam to używać funkcji pformat(), która może formatować struktury danych, takie jak słowniki, umożliwiając czytelne wyświetlanie informacji.

Zacznij od przejścia do jasnego oznaczenia X wewnątrz małej stacji monitorującej i ustawienia się przodem do terminala komputera. Stacja monitoruje ciśnienie wody i warunki glebowe pobliskiego terenu przygotowywanego pod uprawę roślin. Istnieje stała o nazwie reading, która zawiera dane Pythona zebrane przez stację.

Utwórz zmienną o nazwie data i przypisz jej wartość funkcji marshal.dumps(), ustawiając reading jako argument. Na przykład: data = marshal.dumps(reading). Użyj zmiennej data z predefiniowaną funkcją display(), aby wyświetlić zserializowane dane.

Wyjdź ze stacji i udaj się do złotego oznaczenia X, użyj funkcji open(), aby otworzyć drzwi i uzyskać dostęp do biura. Przejdź do jasnego oznaczenia X przed terminalem i zdeserializuj dane, które przed chwilą zserializowałeś. Utwórz zmienną o nazwie output i przypisz jej wartość funkcji marshal.loads(), używając poprzedniej zmiennej data jako argumentu. Użyj funkcji write() i podaj output jako argument, aby uzyskać dostęp do danych zebranych ze stacji monitorującej.

Przejdź do jasnego oznaczenia X na niebieskim dywanie w biurze. Na terminalu sprawdzimy protokoły, aby określić, którego z nich będzie używał moduł pickle podczas przetwarzania danych. W predefiniowanej funkcji write() ustaw argumenty jako pickle.DEFAULT_PROTOCOL i pickle.HIGHEST_PROTOCOL. Dzięki temu zweryfikujesz, jaki jest bieżący protokół serializacji oraz najnowszy dostępny protokół.

Przejdź do ciemnego oznaczenia X na niebieskim dywanie. Teraz, gdy potwierdziliśmy protokoły, możemy zweryfikować zapisane dane. Dane były zbierane i zapisywane przez kilka miesięcy w stałej o nazwie samples. Utwórz trzy zmienne o nazwach: sereal_0, sereal_2 i sereal_5, których użyjemy do zweryfikowania trzech dostępnych protokołów serializacji. Protokół 0 to czytelny ASCII, mało wydajny; protokół 2 to bardziej wydajny format binarny; protokół 5 to najnowszy protokół z najbardziej zaawansowanymi funkcjami.

Zapisz wynik wywołania pickle.dumps(), podając jako argumenty stałą samples i protokół odpowiadający numerowi w nazwie zmiennej. Na przykład dla sereal_0 ustaw protokół na 0 w ten sposób: sereal_0 = pickle.dumps(samples, protocol=0). Użyj sereal_0, sereal_2 i sereal_5 z predefiniowaną funkcją display(), aby sprawdzić różnice w serializacji dla każdego protokołu.

Przejdź do jasnego oznaczenia X na czerwonym dywanie i ustaw się przed terminalem. Nadpisz zmienną output i przypisz jej wynik funkcji pickle.loads(), podając sereal_5 jako argument, aby zdeserializować dotychczas zebrane dane. Użyj funkcji display() i wewnątrz niej wywołaj pformat(output), aby wyświetlić dane. Na przykład: await player.display(pformat(output)). Zwróć uwagę na oceny dla każdego miesiąca wyświetlone w terminalu, abyś mógł je później wprowadzić do wykresu.

Przejdź do ciemnego oznaczenia X na czerwonym dywanie i ustaw się przy biurku. W predefiniowanej funkcji write() wpisz oceny, które zanotowałeś dla każdego miesiąca, wcześniej wyświetlone w terminalu. Dodaj je jako ciągi znaków w cudzysłowie ("") w odpowiedniej kolejności, tak jak jest to określone w funkcji, aby ukończyć poziom.

Księga Kodów