Edistynyt Python-kehityskurssi
Luku
>
Taso
Serialisointimoduulit
Struct-moduuli
Tavoite
Määritä uuden viljelymaan lopullinen dataerittely struct-moduulia käyttäen.
Tien päässä on huoltoasema, joka hallinnoi valmiiksi rakennettua uutta viljelymaata ja jo istutettuja viljelykasveja. Tässä tarkastelemme ja käsittelemme tietoja jo istutetuista viljelykasveista ja viljelymaan ennustetuista tuotoksista. Kuten tämän luvun muissa tasoissa, työskentelemme tietojen sarjoittamisen ja purkamisen parissa, ja esittelemme yhden viimeisistä moduuleista nimeltään struct-moduuli.
Struct-moduuli tarjoaa joukon sarjoitusfunktioita, jotka pakkaavat tiedot binaarimuotoon. Toisin kuin muissa moduuleissa, joilla olemme työskennelleet, sen avulla voit kuitenkin hallita tarkemmin, miten tiedot muotoillaan sekä sarjoitettaessa että purettaessa, mikä tekee siitä monipuolisemman kuin muut moduulit. Käytä import struct päästäksesi käsiksi seuraaviin funktioihin, joita käytämme tietojen käsittelyssä:
struct.calcsize(): Määrittää, kuinka monta tavua tietty muotoilumerkkijono pakkaa. Funktio ottaa yhden (1) argumentin, joka on muoto, jonka tavukoon haluat tarkistaa. Käytettävät muodot ovat:- integer: merkitty
'i', muoto kokonaislukuja varten - float: merkitty
'f', muoto desimaalilukuja varten - double: merkitty
'd', muoto monimutkaisempia desimaalilukuja varten, joissa float-muoto ei riitä.
- integer: merkitty
struct.pack(): Sarjoittaa tiedot binaarimuotoon haluamassasi muodossa. Funktio ottaa kaksi (2) tai useamman argumentin: muodon, jota haluat käyttää, ja sarjoitettavat arvot. Muodot ovat edellä määriteltyjä, ja niitä on lisättävä vastaavasti kuin argumentteja lisäät.struct.unpack(): Pura binaarimuotoon sarjoitetut tiedot. Funktio ottaa kaksi (2) argumenttia: muodon, johon se vastaa sarjoitusmuotoa, ja sarjoitetut tiedot.struct.iter_unpack(): Pura binaarimuotoon sarjoitetut tiedot samalla tavalla kuinstruct.unpack(), mutta iteroi läpi kukin tietolohko erikseen silmukan avulla.struct.pack_into(): Hankalampi versiostruct.pack()-funktiosta. Se ottaa neljä (4) argumenttia: muodon, datan buffermuuttujan, position bufferissa, johon tiedot sijoitetaan, ja lopuksi sarjoitettavat tiedot.struct.unpack_from(): Hankalampi versiostruct.unpack()-funktiosta. Se ottaa kolme (3) argumenttia: muodon, datan buffermuuttujan, josta tiedot puretaan, ja sijainnin bufferissa. Tämä mahdollistaa tietyn osan datan purkamisen.
Kävele huoltoaseman valoiseen X-merkkiin ja käänny pöytää kohti. Luo kolme (3) muuttujaa nimeltä integer, float ja double. Käytämme näitä varmistaaksemme kunkin muodon tavukoon käyttäen struct.calcsize()-funktiota. Käytä integer-muuttujassa funktiota argumenttina 'i', float-muuttujassa 'f' ja double-muuttujassa 'd'. Esimerkiksi: integer = struct.calcsize('i'). Lisää nämä kolme (3) muuttujaa valmiiksi kirjoitettuun write()-funktioon.
Kävele kultaisen X-merkin kohdalle ja käytä read()-funktiota kerätäksesi tietoja uudesta viljelymaasta. Merkitse ylös tiedon kohdat ja muodot tulevaa käyttöä varten: Resources, Size ja Estimate. Kun olet merkinnyt nämä, kävele sinisen maton valoiseen X-merkkiin ja luo muuttuja nimeltä blue_data.
Tallenna blue_data-muuttujaan struct.pack()-funktion arvo, asettamalla argumenteiksi aiemmin kirjaamasi muoto ja arvot. Muotoa kirjoittaessasi sinun on pakattava muototyypit yhdeksi kokonaisuudeksi. Esimerkiksi kokonaislukumuoto on merkitty 'i', joten jos lisäät kolme kokonaislukutyyppiä, merkitset ne 'iii'. Vastaavasti jos lisäät kokonaisluvun, desimaaliluvun (float) ja double-tyypin, kirjoitat ne 'ifd'. Datan lisäät sijoittamalla arvot yksitellen argumenteiksi. Tässä on kokonaisesimerkki:
data_1 = 8 # is an integer data_2 = 2.25 # is a float data_3 = 900.702938103 # is a double blue_data = struct.pack('ifd', data_1, data_2, data_3)
struct.pack()-funktio tarjoaa paljon joustavuutta: voit määrittää datan muotoilun tavan ja sarjoittaa useita datapisteitä kerralla oman harkintasi mukaan. Lisää aiemmin luetut tiedot käyttäen yllä olevaa esimerkkiä pohjana. Käytä display()-funktiota argumenttina blue_data nähdäksesi pakatut tiedot.
Kävele sinisen maton tumman X-merkin kohdalle ja käänny päätelaitetta kohti. Luo muuttuja nimeltä blue_unpack ja tallenna siihen struct.unpack()-funktion arvo, asettamalla argumenteiksi sama muoto, jota käytit datan pakkaamiseen, ja blue_data-muuttuja. Muoto kirjoitetaan samalla tavalla kuin struct.pack()-funktiossa, jotta saat purettua datan samalla tavalla kuin alun perin pakasit sen. Käytä write()-funktiota argumenttina blue_unpack varmistaaksesi aiemmin pakatun datan.
Samoissa tiloissa käytämme myös struct.iter_unpack()-funktiota, joka ottaa täsmälleen samat argumentit kuin struct.unpack(), mutta on muotoiltu for-silmukaksi. Tämä antaa mahdollisuuden iterointiin yksittäisten datalohkojen läpi sen sijaan, että kirjoittaisimme kaiken suoraan. Funktio koodataan seuraavasti:
for values in struct.iter_unpack(-insert value-, -insert value-): player.speak(values)
Käytämme speak()-funktiota arvojen näyttämiseen. Täydennä struct.iter_unpack()-funktion puuttuvat argumentit samaan tapaan kuin käytit struct.unpack()-funktiossa, sillä ne ovat saman funktion eri versioita käyttöperiaatteiltaan.
Kävele punaisen maton kultaisen X-merkin kohdalle ja käänny pöytää kohti. Käytä read()-funktiota tarkastaaksesi viljelykasvien määrät. Merkitse ylös kaikki määrät ja kunkin kasvin muoto. Kävele punaisen maton valoiseen X-merkkiin ja luo objekti nimeltä buffer, anna sille arvoksi bytearray(16). Se on tavujoukko, johon voimme kohdistaa tietoja ennen niiden täyttämistä. Se toimii tarkoitukseemme datapankkina, johon voit tallentaa tietoja manuaalisesti. Luku 16 argumenttina on tavujen määrä, jonka buffer-objektiin voi tallentaa.
Käytä struct.pack_into()-funktiota täyttääksesi aiemmin luomasi buffer-objektin. Sinun ei tarvitse luoda erillistä muuttujaa funktion arvon tallentamiseksi, sillä funktio sijoittaa arvot suoraan buffer-objektiin. Käytämme funktiota jokaisen aiemmin kirjaamamme arvon osalta ja täytämme sen argumentit näillä arvoilla.
Esimerkiksi ensimmäistä kasvimäärää varten saat muodon, tavupositiot ja määrän. Lisää muoto ensimmäiseksi argumentiksi, sijainniksi käytetään tässä buffer-objektia. Kolmanneksi argumentiksi määritä asema, johon arvo lisätään buffer-objektissa; muoto määrittää käytetyt tavut, joten varmista, ettet pakkaa tietoja jo varattuun tilaan. Lopuksi lisää sarjoitettava ja pakattava arvo buffer-objektiin:
struct.pack_into('i', buffer, 0, 82)
buffer-objektissa on siis 16 tavua. Yllä olevassa esimerkissä kokonaislukumuoto vie 4 tavua ja sijoittuu kohtaan 0. Tämä tarkoittaa, että datan lisäämisen jälkeen buffer-objektiin jää 12 vapaata tavua, kun tavut 0–3 ovat varattuina annetulle arvolla (tässä tapauksessa 82). Toista tämä kaikille aiemmin luetuille ja merkityille kasvidatalle; yhteensä niitä on kolme (3). Käytä display()-funktiota ja argumenttina buffer näyttääksesi sarjoitetun datan.
Kävele punaisen maton tumman X-merkin kohdalle ja käänny päätelaitetta kohti. Tässä puramme datan varmistaaksemme sen sisällön säilymisen. Luo kolme muuttujaa: lettuce, carrots ja melons. Puremme kunkin datapisteen erikseen. Kunkin muuttujan arvoksi asetetaan struct.unpack_from()-funktion palauttama arvo, ja argumenteiksi käytetään samaa tietoa, jolla data pakattiin. Ensimmäiseksi argumentiksi lisätään muoto, toiseksi buffer-objekti (josta puretaan), ja lopuksi sijainti buffer-objektissa, josta puretaan data. Esimerkiksi:
lettuce = struct.unpack_from('i', buffer, 0)
Tämä vastaa aiemmassa pakkausesimerkissä pakattua dataa, pura samalla tavalla kaksi muuta muuttujaa ja lisää lettuce, carrots ja melons valmiiksi kirjoitettuun write()-funktioon tason suorittamiseksi.