Curs Avansat de Dezvoltare Python
Capitolul
>
Nivel
Module de serializare
Modulele Marshal și Pickle
Obiectiv
Mergi la stația de service și asigură-te că datele sunt stocate corect folosind modulul JSON pentru a formata fișierele.
Continuând pe traseu, întâlnim câteva stații care monitorizează distribuția apei și calitatea solului pentru terenul aflat în dezvoltare pentru o recoltă viitoare. Pentru a procesa datele, este eficient să serializăm datele. În timp ce folosirea lui Json poate fi eficientă ca soluție generalizată, există și câteva metode de serializare specifice Python, și anume modulele Marshal și Pickle. Modulul Marshal este conceput pentru serializare/deserializare rapidă prin convertirea datelor în format binar, ideal pentru transferuri de date mai simple. Modulul Pickle este mai lent, dar este conceput pentru a procesa structuri de date mai complexe și este mult mai flexibil, ideal pentru structuri de date mai mari sau de prioritate.
Pentru a folosi modulele Marshal și Pickle, importă funcțiile lor scriind: import marshal și import pickle. Pentru scopurile noastre, vom folosi următoarele funcții:
marshal.dumps(): Serializează datele în format binar, conceput pentru viteză în cadrul Python. Primește un argument, și anume datele pe care dorești să le serializezi, fiind limitat la tipuri de date de bază.marshal.loads(): Deserializază date binare în tipuri de date citibile de Python, limitat în capabilități, dar cu execuție rapidă. Primește un argument, și anume datele de deserializat.pickle.DEFAULT_PROTOCOL: Verifică ce versiune de protocol pentru serializarea Pickle este implicită în versiunea ta de Python. Protocoalele influențează modul în care datele sunt serializate.pickle.HIGHEST_PROTOCOL: Verifică ce versiune de protocol pentru serializarea Pickle este cea mai înaltă disponibilă în versiunea ta de Python. Protocoalele influențează modul în care datele sunt serializate.pickle.dumps(): Serializează structuri complexe de date Python în format binar conform protocolului utilizat. Primește două argumente, datele pe care dorești să le serializezi și versiunea de protocol pe care dorești să o folosești la serializare.pickle.loads(): Deserializază date binare în tipuri de date citibile de Python, puternic în procesarea obiectelor Python. Primește un argument, și anume datele pe care dorești să le deserializi.
În plus față de aceste module și funcții, vom folosi și un modul de formatare numit pprint, pe care îl vom importa folosind from pprint import pprint. Acest lucru ne permite să folosim funcția pprint() care poate fi folosită pentru a formata structuri de date precum dicționare, permițându-ne să afișăm informațiile clar.
Pentru a începe, mergi spre semnul X luminos din interiorul micii stații de monitorizare și îndreaptă-te spre terminalul de computer. Stația monitorizează presiunea apei și condițiile solului din terenul din apropiere, aflat în dezvoltare pentru plantarea culturilor. Există o constantă numită reading, care conține date Python colectate de stație.
Creează o variabilă numită data și stochează valoarea funcției marshal.dumps() setând reading ca argument. Astfel: data = marshal.dumps(reading). Folosește variabila data împreună cu funcția pre-scrisă display() pentru a vizualiza datele variabilei serializate.
Ieși din stație și îndreaptă-te spre semnul X auriu, folosește funcția open() pentru a deschide ușa și a obține acces la birou. Mergi spre semnul X luminos din fața terminalului și deserializa datele pe care tocmai le-ai serializat. Creează o variabilă numită output și stochează valoarea funcției marshal.loads() cu variabila data ca argument. Folosește funcția write() și adaugă output ca argument pentru a accesa datele serializate pe care le-ai colectat de la stația de monitorizare.
Mergi spre semnul X luminos peste covorul albastru din birou, la terminal vom verifica protocoalele pentru a determina ce tip de serializare va folosi modulul pickle la procesarea datelor. În funcția pre-scrisă write(), setează argumentele ca pickle.DEFAULT_PROTOCOL și pickle.HIGHEST_PROTOCOL. Acest lucru va verifica care este protocolul actual de serializare, precum și cel mai recent protocol de serializare disponibil în acest moment.
Mergi la semnul X întunecat peste covorul albastru, acum că am confirmat protocoalele, putem verifica datele stocate. Datele au fost colectate și stocate de-a lungul lunilor și sunt păstrate într-o constantă numită samples. Creează trei variabile numite: sereal_0, sereal_2 și sereal_5; le vom folosi pentru a verifica trei dintre protocoalele disponibile pentru serializare. Protocolul 0 este ASCII lizibil, nu foarte eficient, Protocolul 2 este un format binar mai eficient iar Protocolul 5 este cel mai recent, cu cele mai complexe caracteristici adăugate.
Vom stoca valoarea funcției pickle.dumps() și vom seta ca argumente constanta sample și protocol corespunzător numărului din numele variabilei. De exemplu, pentru sereal_0 vom seta protocol ca 0, astfel: sereal_0 = pickle.dumps(samples, protocol=0). Folosește variabilele sereal_0, sereal_2 și sereal_5 împreună cu funcția pre-scrisă display() pentru a verifica cât de diferită este serializarea pentru fiecare protocol.
Mergi la semnul X luminos peste covorul roșu și îndreaptă-te spre terminal, suprascrie variabila output și stochează valoarea funcției pickle.loads() setând ca argument sereal_5 pentru a deserializa datele de probă care au fost colectate până acum. Folosește funcția display() și adaugă funcția pprint() cu variabila output pentru a vizualiza datele. Astfel: await player.display(pprint(output)). Notează ratingurile pentru fiecare lună afișate în terminal, pentru ca ulterior să le poți nota.
Mergi la semnul X întunecat peste covorul roșu și îndreaptă-te spre birou, pe funcția pre-scrisă write(), adaugă ratingurile pe care le-ai notat pentru fiecare lună, care au fost afișate anterior în terminal. Adaugă-le ca șiruri de caractere, cu ghilimele "", în ordinea corectă așa cum sunt prezentate în funcție pentru a finaliza nivelul.