Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom

Moduły serializacji
Moduły Marshal i Pickle

Cel

Udaj się do stacji obsługi i upewnij się, że dane są poprawnie zapisane, używając modułu JSON do formatowania plików.

Kontynuując drogą, napotykamy kilka stacji monitorujących dystrybucję wody oraz jakość gleby na terenach, które są rozwijane pod przyszłe zbiory. Aby przetworzyć dane, efektywne jest ich serializowanie. Chociaż użycie Json może być skutecznym rozwiązaniem ogólnym, istnieje również kilka metod serializacji specyficznych dla Pythona, a mianowicie moduły Marshal i Pickle. Moduł Marshal jest zaprojektowany do szybkiej serializacji/deserializacji poprzez konwersję danych do formatu binarnego, co jest idealne przy prostszych transferach danych. Moduł Pickle jest wolniejszy, ale został zaprojektowany do przetwarzania bardziej złożonych struktur danych i jest znacznie bardziej elastyczny, co czyni go idealnym dla większych lub priorytetowych struktur danych.

Aby korzystać z modułów Marshal i Pickle, zaimportuj ich funkcje, wpisując: import marshal oraz import pickle. Dla naszych celów będziemy używać następujących funkcji:

  • marshal.dumps(): Serializuje dane do formatu binarnego, zaprojektowany z myślą o szybkości działania w Pythonie. Przyjmuje jeden argument, którym są dane, które chcesz zserializować, ograniczone do podstawowych typów danych.
  • marshal.loads(): Deserializuje dane binarne do czytelnych dla Pythona typów danych, ograniczony w swoich możliwościach, ale wykonuje operację szybko. Przyjmuje jeden argument, którym są dane do deserializacji.
  • pickle.DEFAULT_PROTOCOL: Sprawdza, która wersja protokołu serializacji Pickle jest domyślna w Twojej wersji Pythona. Protokół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. Protokół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, które chcesz zserializować, oraz wersję protokołu, którą chcesz użyć podczas serializacji.
  • pickle.loads(): Deserializuje dane binarne do czytelnych dla Pythona typów danych, oferując duże możliwości w zakresie obiektów Pythona. Przyjmuje jeden argument, którym są dane, które chcesz deserializować.

Oprócz tych modułów i funkcji, będziemy również korzystać z modułu formatowania o nazwie pformat, który zaimportujemy używając from pprint import pformat. Umożliwia nam to użycie funkcji pformat(), która może być wykorzystana do formatowania struktur danych, takich jak słowniki, umożliwiając wyraźne wyświetlanie informacji.

Na początek udaj się do oznaczenia X oświetlonego światłem wewnątrz małej stacji monitorującej i staw czoła terminalowi komputera. Stacja monitoruje ciśnienie wody oraz warunki gleby na pobliskim terenie, który jest rozwijany 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 do niej wartość funkcji marshal.dumps(), ustawiając reading jako argument. W ten sposób: data = marshal.dumps(reading). Użyj zmiennej data z wcześniej napisaną 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. Udaj się do oznaczenia X oświetlonego światłem przed terminalem i zdeserializuj dane, które właśnie zserializowałeś. Utwórz zmienną o nazwie output i przypisz do niej wartość funkcji marshal.loads() z wcześniejszą zmienną data jako argument. Użyj funkcji write() i podaj output jako argument, aby uzyskać dostęp do zserializowanych danych zebranych przez stację monitorującą.

Udaj się do oznaczenia X oświetlonego światłem na niebieskim dywanie w biurze, na terminalu zweryfikujemy protokoły, aby określić, jakiego typu serializacji będzie używał moduł Pickle podczas przetwarzania danych. W wcześniej napisanej funkcji write(), ustaw argumenty jako pickle.DEFAULT_PROTOCOL oraz pickle.HIGHEST_PROTOCOL. To zweryfikuje, jaki jest aktualny protokół serializacji, a także najnowszy dostępny protokół serializacji.

Przejdź do oznaczenia X oświetlonego ciemnym światłem na niebieskim dywanie, teraz gdy potwierdziliśmy protokoły, możemy zweryfikować zapisane dane. Dane były zbierane i przechowywane przez miesiące oraz zapisane w stałej o nazwie samples. Utwórz trzy zmienne o nazwach: sereal_0, sereal_2 oraz sereal_5, których użyjemy do weryfikacji trzech dostępnych protokołów serializacji. Protokół 0 korzysta z czytelnego formatu ASCII, nie jest zbyt wydajny, protokół 2 to bardziej wydajny format binarny, a protokół 5 to najnowszy z dodatkowymi, najbardziej złożonymi funkcjami.

Przechowamy wartość funkcji pickle.dumps() i ustawimy jako argumenty stałą samples oraz protocol odpowiadający liczbie umieszczonej w nazwie zmiennej. Na przykład, dla sereal_0 ustawimy protocol jako 0, w ten sposób: sereal_0 = pickle.dumps(samples, protocol=0). Użyj zmiennych sereal_0, sereal_2 i sereal_5 z wcześniej napisaną funkcją display(), aby zweryfikować, jak różni się serializacja dla poszczególnych protokołów.

Udaj się do oznaczenia X oświetlonego światłem na czerwonym dywanie i staw czoła terminalowi, nadpisz zmienną output i przypisz do niej wartość funkcji pickle.loads() z argumentem sereal_5, aby zdeserializować próbkę danych zebranych do tej pory. Użyj funkcji display() i dodaj funkcję pformat() z zmienną output, aby wyświetlić dane. W ten sposób: await player.display(pformat(output)). Zanotuj oceny każdego miesiąca wyświetlone na terminalu, aby móc je później spisać.

Udaj się do oznaczenia X oświetlonego ciemnym światłem na czerwonym dywanie i staw czoła biurku, w wcześniej napisanej funkcji write() dodaj oceny, które zanotowałeś dla każdego miesiąca, wcześniej wyświetlone na terminalu. Dodaj je jako ciągi znaków ujęte w "" w odpowiedniej kolejności, zgodnie z opisem funkcji, aby ukończyć poziom.

Księga Kodów