Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom
Moduły serializacji
Moduły Marshal i Pickle
Cel
Udaj się do stacji serwisowej i upewnij się, że dane są prawidłowo zapisywane przy użyciu modułu JSON do formatowania plików.
Kontynuując ścieżką, natykamy się na 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. Choć użycie Json może być skutecznym, ogólnym rozwiązaniem, istnieje również kilka metod specyficznych dla Pythona, takich jak moduły Marshal i Pickle. Moduł Marshal został zaprojektowany do szybkiej serializacji/deserializacji przez konwersję danych do formatu binarnego, co jest idealne dla prostszych transferów danych. Moduł Pickle jest wolniejszy, ale został stworzony do przetwarzania bardziej złożonych struktur danych i jest dużo bardziej elastyczny, co czyni go idealnym dla większych lub priorytetowych struktur danych.
Aby użyć modułów Marshal i Pickle, zaimportuj ich funkcje, wpisując: import marshal oraz import pickle. W naszym przypadku będziemy korzystać z następujących funkcji:
marshal.dumps(): Serializuje dane do formatu binarnego, zaprojektowany z myślą o szybkości w Pythonie. Przyjmuje jeden argument, którym są dane, które chcesz serializować, ograniczone do podstawowych typów danych.marshal.loads(): Deserializuje dane binarne do typów danych czytelnych dla Pythona, ograniczone w swoich możliwościach, ale zapewniające szybkie wykonanie. Przyjmuje jeden argument, którym są dane do deserializacji.pickle.DEFAULT_PROTOCOL: Sprawdza, jaka wersja protokołu serializacji Pickle jest domyślna w Twojej wersji Pythona. Protokoły wpływają na sposób, w jaki dane są serializowane.pickle.HIGHEST_PROTOCOL: Sprawdza, jaka wersja protokołu serializacji Pickle jest najwyższa dostępna w Twojej wersji Pythona. Protokoły wpływają na sposób, w jaki dane są serializowane.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 serializować, oraz wersję protokołu, którą chcesz użyć przy serializacji.pickle.loads(): Deserializuje dane binarne do typów danych czytelnych dla Pythona, oferując szerokie możliwości dla obiektów Pythona. Przyjmuje jeden argument, którym są dane, które chcesz deserializować.
Oprócz tych modułów i funkcji, będziemy także korzystać z modułu formatowania o nazwie pprint, który zaimportujemy przy użyciu from pprint import pprint. Umożliwia nam to użycie funkcji pprint() do formatowania struktur danych, takich jak słowniki, co pozwala na przejrzyste wyświetlanie informacji.
Na początek udaj się do lekkiego znaku X wewnątrz małej stacji monitoringu i staw czoła terminalowi komputerowemu. Stacja monitoruje ciśnienie wody oraz warunki glebowe pobliskiego terenu, który jest rozwijany pod uprawę roślin. Istnieje stała o nazwie reading, która zawiera dane Pythona zebrane przez stację.
Stwórz zmienną o nazwie data i przypisz do niej wartość zwracaną przez funkcję marshal.dumps(), ustawiając reading jako argument. W ten sposób: data = marshal.dumps(reading). Użyj zmiennej data z wstępnie przygotowaną funkcją display(), aby wyświetlić zserializowane dane.
Wyjdź do stacji i udaj się do złotego znaku X, użyj funkcji open(), aby otworzyć drzwi i uzyskać dostęp do biura. Udaj się do lekkiego znaku X przed terminalem i zdeserializuj dane, które właśnie zserializowałeś. Stwórz zmienną o nazwie output i przypisz do niej wartość zwracaną przez funkcję marshal.loads(), używając poprzedniej zmiennej data jako argumentu. Użyj funkcji write() i przekaż output jako argument, aby uzyskać dostęp do zserializowanych danych zebranych ze stacji monitoringu.
Udaj się do lekkiego znaku X na niebieskim dywanie w biurze, przy terminalu zweryfikujemy protokoły, aby określić, jakiego typu serializację będzie używał moduł pickle podczas przetwarzania danych. W wstępnie przygotowanej funkcji write(), ustaw argumenty jako pickle.DEFAULT_PROTOCOL oraz pickle.HIGHEST_PROTOCOL. To zweryfikuje, jaki jest obecny protokół serializacji oraz najnowszy dostępny protokół.
Przesuń się do ciemnego znaku X na niebieskim dywanie, gdyż teraz, gdy potwierdziliśmy protokoły, możemy zweryfikować zapisane dane. Dane były gromadzone i przechowywane przez miesiące w stałej o nazwie samples. Stwórz trzy zmienne o nazwach: sereal_0, sereal_2 oraz sereal_5 – użyjemy ich do weryfikacji trzech dostępnych protokołów serializacji. Protokół 0 to czytelny format ASCII, niezbyt wydajny, protokół 2 to bardziej wydajny format binarny, a protokół 5 to najnowszy, z najbardziej zaawansowanymi funkcjami.
Przechowamy wartość zwracaną przez pickle.dumps() i ustawimy jako argumenty stałą samples oraz protocol odpowiadający liczbie zawartej 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 oraz sereal_5 z wstępnie przygotowaną funkcją display(), aby zweryfikować różnice w serializacji dla poszczególnych protokołów.
Udaj się do lekkiego znaku X na czerwonym dywanie i staw czoła terminalowi, nadpisz zmienną output i przypisz do niej wartość zwracaną przez funkcję pickle.loads(), ustawiając jako argument sereal_5, aby zdeserializować zebrane dotychczas dane próbki. Użyj funkcji display() i dodaj funkcję pprint() z argumentem output, aby wyświetlić dane. W ten sposób: await player.display(pprint(output)). Zanotuj oceny za każdy miesiąc wyświetlone w terminalu, aby móc je później zapisać.
Udaj się do ciemnego znaku X na czerwonym dywanie i staw czoła biurku, przy wstępnie przygotowanej funkcji write(), dodaj oceny, które zanotowałeś dla każdego miesiąca, wcześniej wyświetlone w terminalu. Dodaj je jako ciągi znaków ujęte w cudzysłowy "" w odpowiedniej kolejności, jak określono w funkcji, aby ukończyć poziom.