Edistynyt Python-kehityskurssi
Luku
>
Taso
Sarjallistamismoduulit
Marshal- ja Pickle-moduulit
Tavoite
Mene huoltoasemalle ja varmista, että data tallennetaan oikein käyttämällä JSON-moduulia tiedostojen muotoiluun.
Kun jatkamme polkua pitkin, löydämme muutaman aseman, jotka valvovat vesijakelua ja maaperän laatua alueella, jota kehitetään tulevaa satoa varten. Datan käsittelyä varten on tehokasta sarjoittaa (serialize) tieto. Vaikka JSONin käyttö voi toimia yleisratkaisuna, on olemassa myös muutama Python-spesifinen sarjoitusmenetelmä, kuten Marshal- ja Pickle-moduulit. Marshal-moduuli on suunniteltu nopeaan sarjoittamiseen ja desarjoittamiseen muuntamalla data binaarimuotoon, mikä on ihanteellista yksinkertaisempiin tiedonsiirtoihin. Pickle-moduuli on hitaampi, mutta se on suunniteltu käsittelemään monimutkaisempia tietorakenteita ja on paljon joustavampi, mikä tekee siitä ihanteellisen suurempiin tai kriittisempiin tietorakenteisiin.
Käyttääksesi Marshal- ja Pickle-moduuleja, tuo niiden funktiot kirjoittamalla: import marshal ja import pickle. Tässä tehtävässä käytämme seuraavia funktioita:
marshal.dumps(): Sarjoittaa (serialize) datan binaarimuotoon, nopeuskeskeinen Pythonin sisällä. Ottaa yhden argumentin, eli datan, jonka haluat sarjoittaa, ja on rajoitettu perusdatatyyppeihin.marshal.loads(): Desarjoittaa binaaridatan Pythonin luettavaksi datatyypeiksi, rajoitettu ominaisuuksiltaan mutta nopea suoritukseltaan. Ottaa yhden argumentin, eli desarjoitettavan datan.pickle.DEFAULT_PROTOCOL: Tarkistaa, mikä Pickle-sarjoitusprotokollan versio on oletusarvoisenasi Python-versiossasi. Protokollat vaikuttavat siihen, miten data sarjoitetaan.pickle.HIGHEST_PROTOCOL: Tarkistaa, mikä Pickle-sarjoitusprotokollan versio on uusin käytettävissä Python-versiossasi. Protokollat vaikuttavat siihen, miten data sarjoitetaan.pickle.dumps(): Sarjoittaa monimutkaiset Pythonin tietorakenteet binaarimuotoon valitun protokollan mukaan. Ottaa kaksi argumenttia: datan, jonka haluat sarjoittaa, ja protokollaversion, jota haluat käyttää sarjoituksessa.pickle.loads(): Desarjoittaa binaaridatan Pythonin luettaviksi datatyypeiksi, tehokas Python-objektien käsittelyssä. Ottaa yhden argumentin, eli desarjoitettavan datan.
Näiden moduulien ja funktioiden lisäksi käytämme myös pformat-nimistä muotoilumoduulia, jonka tuomme komennolla from pprint import pformat. Tämä antaa meille mahdollisuuden käyttää funktiota pformat(), jolla voimme muotoilla esimerkiksi sanakirjoja (dictionaries) siten, että tiedot esitetään selkeästi.
Aloittaaksesi kävele pienessä valvonta-asemassa olevan vaalean X-merkin kohdalle ja käänny tietokoneterminaalia kohti. Asema valvoo vesipainetta ja maaperän olosuhteita lähellä olevalta alueelta, jota kehitetään viljelykasvien istutusta varten. Saatavillasi on muuttumaton (constant) nimeltä reading, joka sisältää asemalta kerätyn Python-datan.
Luo muuttuja nimeltä data ja tallenna siihen marshal.dumps()-funktion paluuarvo asettamalla argumentiksi reading. Esimerkiksi: data = marshal.dumps(reading). Käytä data-muuttujaa valmiissa display()-funktiossa nähdäksesi sarjoitetun muuttujadatan.
Poistu asemalta ja suuntaa kultaisen X-merkin kohdalle. Käytä open()-funktiota avataksesi oven ja päästäksesi toimistoon. Kävele vaalean X-merkin kohdalle terminaalin eteen ja desarjoita juuri sarjoittamasi data. Luo muuttuja nimeltä output ja tallenna siihen marshal.loads()-funktion paluuarvo käyttäen argumenttina edellistä data-muuttujaa. Käytä write()-funktiota ja lisää argumentiksi output käyttääksesi valvonta-asemalta keräämääsi sarjoitettua dataa.
Kävele toimiston sinisen maton päällä sijaitsevan vaalean X-merkin kohdalle, terminaalissa tulemme tarkistamaan protokollat selvittääksemme, mitä sarjoitusprotokollaa pickle-moduuli käyttää datan käsittelyssä. Aseta valmiiksi kirjoitetussa write()-funktiossa argumenteiksi pickle.DEFAULT_PROTOCOL ja pickle.HIGHEST_PROTOCOL. Näin varmistat nykyisen sarjoitusprotokollan sekä käytettävissä olevan uusimman protokollan.
Siirry sinisen maton päällä olevaan tumman X-merkin kohdalle. Nyt kun olemme vahvistaneet protokollat, voimme tarkistaa tallennetun datan. Dataa on kerätty ja tallennettu kuukausien ajan muuttujaan samples. Luo kolme muuttujaa nimeltä sereal_0, sereal_2 ja sereal_5. Käytämme näitä tarkistaaksemme kolme sarjoitusprotokollaa. Protokolla 0 on luettava ASCII-muoto, joka ei ole kovin tehokas, protokolla 2 on tehokkaampi binaarimuoto ja protokolla 5 on uusin, jossa on monimutkaisempia ominaisuuksia.
Tallennamme pickle.dumps()-funktion paluuarvon asettamalla argumenteiksi samples-vakion ja muuttujan nimestä vastaavan protokollan numeron. Esimerkiksi sereal_0-muuttujalle asetamme protokollaksi 0, näin: sereal_0 = pickle.dumps(samples, protocol=0). Käytä sereal_0, sereal_2 ja sereal_5 -muuttujia valmiissa display()-funktiossa nähdäksesi, miten paljon sarjoitus eri protokollilla eroaa.
Kävele punaisen maton päällä olevan vaalean X-merkin kohdalle ja käänny terminaalia kohti. Ylikirjoita output-muuttuja ja tallenna siihen pickle.loads()-funktion paluuarvo asettamalla argumentiksi sereal_5, jotta desarjoitat tähän mennessä kerätyt näyteaineistot. Käytä display()-funktiota ja lisää pformat()-funktio output-muuttujan kanssa nähdäksesi datan. Esimerkiksi: await player.display(pformat(output)). Tee muistiinpanot jokaisen kuukauden arvosanoista, jotka näytetään terminaalissa, jotta voit piirtää ne myöhemmin.
Kävele punaisen maton päällä olevan tumman X-merkin kohdalle ja käänny pöytää kohti. Valmiiksi kirjoitetussa write()-funktiossa lisää terminaalissa aiemmin näkyneiden kuukausiarvosanojen mukaiset arvot. Lisää ne merkkijonoina ("") oikeassa järjestyksessä, kuten funktiossa on määritelty, tason suorittamisen loppuun saattamiseksi.