Kursus Pembangunan Python Lanjutan
Bab
>
Tahap

Modul Penyerialan
Modul Struct

Objektif

Sediakan pecahan data akhir untuk tanah pertanian baru menggunakan modul struct.

Di hujung jalan terdapat sebuah stesen perkhidmatan yang menguruskan tanah pertanian baru yang telah siap dibina dan tanaman yang telah ditanam. Di sini kita akan memeriksa dan memproses data bagi tanaman yang telah ditanam dan unjuran hasil tanah pertanian tersebut. Seperti tahap lain dalam bab ini, kita akan bekerja dengan serialisasi dan deserialisasi data, dengan memperkenalkan satu modul terakhir yang dinamakan modul struct.

Modul struct memperkenalkan satu siri fungsi serialisasi yang akan mengepak data dalam format binari. Berbeza dengan modul lain yang telah kita gunakan, modul ini memberikan kawalan yang lebih besar ke atas cara kita menyusun data semasa ia diserialkan dan kemudian dideserialkan, menjadikannya lebih serba boleh berbanding modul lain. Gunakan import struct untuk mengakses fungsi-fungsi berikut yang akan kita gunakan untuk memproses data:

  • struct.calcsize(): Menentukan berapa bait yang digunakan oleh rentetan format yang diberikan. Ia mengambil satu (1) argumen, iaitu format yang anda ingin semak saiz baitnya. Format yang akan kita gunakan ialah:
    • integer: diwakili sebagai 'i', format untuk data yang diwakili dalam nombor bulat
    • float: diwakili sebagai 'f', format untuk data yang diwakili dalam nombor perpuluhan
    • double: diwakili sebagai 'd', format untuk data yang diwakili dalam nombor perpuluhan lebih kompleks di mana format float tidak mencukupi.
  • struct.pack(): Menyandarkan data ke format binari mengikut format pilihan anda. Ia mengambil dua (2) atau lebih argumen: format yang ingin digunakan dan nilai-nilai yang ingin disandarkan. Format-format yang digunakan ialah seperti yang telah diterangkan sebelum ini, dan anda mesti menambahnya mengikut bilangan argumen nilai.
  • struct.unpack(): Menyah-sandarkan data binari yang telah disandarkan. Ia mengambil dua (2) argumen: format yang perlu sepadan dengan format penyandaran, dan data yang telah disandarkan.
  • struct.iter_unpack(): Menyah-sandarkan data binari yang telah disandarkan, berfungsi sama seperti struct.unpack() tetapi mengiterasi setiap blok data secara berasingan menggunakan gelung.
  • struct.pack_into(): Versi lanjutan struct.pack(). Ia mengambil empat (4) argumen: format yang ingin digunakan, penampan data (buffer) tempat anda ingin meletakkan data, kedudukan dalam penampan, dan data yang ingin disandarkan.
  • struct.unpack_from(): Versi lanjutan struct.unpack(). Ia mengambil tiga (3) argumen: format yang ingin digunakan, penampan data (buffer) untuk nyah-sandaran, dan lokasi dalam penampan untuk nyah-sandaran. Ia membolehkan anda menyah-sandarkan bahagian tertentu data.

Berjalan ke tanda X bercahaya di stesen perkhidmatan dan hadapkan diri ke meja, cipta tiga (3) pembolehubah bernama: integer, float dan double. Kita akan menggunakan ini untuk mengesahkan saiz dalam bait setiap format dengan menggunakan fungsi struct.calcsize(). Untuk pembolehubah integer, gunakan fungsi dengan 'i' sebagai argumen; untuk float, gunakan 'f'; dan untuk double, gunakan 'd' sebagai argumen. Contohnya: integer = struct.calcsize('i'). Tambahkan ketiga-tiga (3) pembolehubah ini ke dalam fungsi write() yang telah ditulis terlebih dahulu.

Berjalan ke tanda X keemasan dan gunakan fungsi read() untuk mengumpul data mengenai tanah pertanian baru, catatkan titik data dan format untuk kegunaan masa depan iaitu: Resources, Size dan Estimate. Setelah selesai, berjalan ke tanda X bercahaya di atas karpet biru dan cipta pembolehubah bernama blue_data.

Dengan pembolehubah blue_data, simpan nilai fungsi struct.pack(), menggunakan argumen format dan nilai-nilai yang telah anda catat sebelum ini. Apabila menulis format, anda mesti "membungkus" jenis-jenis format ke dalam satu unit. Sebagai contoh, format integer dilabelkan 'i' seperti yang diterangkan sebelum ini; jika anda menambah tiga data jenis integer, ia ditulis sebagai 'iii'. Begitu juga, jika anda menambah satu integer, satu float dan satu double, ia akan ditulis 'ifd'. Apabila menambah data, letakkan setiap satu sebagai argumen. Berikut adalah contoh keseluruhan:

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)

Fungsi struct.pack() membolehkan fleksibiliti yang tinggi, membolehkan anda menetapkan bagaimana anda ingin memformat data dan membenarkan penyandaran berbilang titik data sekaligus mengikut budi bicara anda. Tambahkan data yang dibaca sebelum ini menggunakan contoh di atas sebagai asas. Gunakan fungsi display() dengan blue_data sebagai argumen untuk melihat data yang telah dipakekan.

Berjalan ke tanda X gelap di atas karpet biru dan hadapkan diri ke terminal, cipta satu pembolehubah bernama blue_unpack dan simpan nilai fungsi struct.unpack(), dengan menambah format yang sama digunakan untuk membungkus data dan pembolehubah blue_data sebagai argumen. Format ditulis dengan cara yang sama seperti fungsi struct.pack(), supaya anda dapat menyah-sandarkan data dengan cara yang sama seperti anda menyandarkannya. Gunakan fungsi write() dengan blue_unpack sebagai argumen untuk mengesahkan data yang telah anda pakekan sebelum ini.

Di lokasi yang sama, kita juga akan menggunakan fungsi struct.iter_unpack(). Ia mengambil argumen yang sama seperti struct.unpack(), namun kini ia diformatkan sebagai gelung for, yang membolehkan kita mengiterasi data berbanding hanya menulis kesemuanya. Fungsi ini ditulis seperti berikut:

for values in struct.iter_unpack(-insert value-, -insert value-): player.speak(values)

Kita akan menggunakan fungsi speak() untuk memaparkan nilai-nilai tersebut; bagi argumen yang hilang dalam fungsi struct.iter_unpack(), tambahkan argumen yang sama seperti yang digunakan sebelum ini dengan struct.unpack() kerana dari segi penggunaan, ia adalah variasi fungsi yang sama.

Berjalan ke tanda X keemasan di atas karpet merah dan hadapkan diri ke meja, gunakan fungsi read() untuk menyemak kuantiti tanaman. Catat semua kuantiti dan format bagi setiap tanaman. Berjalan ke tanda X bercahaya di atas karpet merah dan cipta objek bernama buffer, kemudian tetapkan nilai bytearray(16). Ini adalah koleksi bait yang boleh kita akses sebelum mengisinya; untuk tujuan kita, ia berfungsi seperti bank data di mana anda boleh menyimpan data secara manual. Nombor 16 sebagai argumen menunjukkan panjang bait yang boleh disimpan dalam objek buffer.

Gunakan fungsi struct.pack_into() untuk mengisi objek buffer yang telah anda cipta. Tidak perlu membuat pembolehubah untuk menyimpan nilai fungsi kerana fungsi itu sendiri akan memasukkan nilai ke dalam objek buffer. Kita akan menggunakan fungsi ini untuk setiap nilai yang telah anda catat sebelum ini dan padankan argumennya dengannya.

Sebagai contoh, bagi nilai tanaman pertama, anda akan diberi formatnya, kedudukan baitnya dan kuantitinya. Tambahkan format sebagai argumen pertama, lokasi tempat anda ingin menyandarkan bait, iaitu buffer dalam kes ini. Untuk argumen ketiga, tetapkan kedudukan di dalam buffer di mana anda ingin menambah nilai tersebut; format menentukan bait yang digunakan, jadi pastikan anda mengepak data pada kedudukan yang belum digunakan. Akhir sekali, tambah nilai yang ingin anda sandarkan dan pekkan ke dalam objek buffer.

struct.pack_into('i', buffer, 0, 82)

Objek buffer mempunyai 16 bait seperti yang dinyatakan sebelum ini; dalam kod di atas, format integer menggunakan 4 bait dan disisipkan pada kedudukan 0. Ini bermakna apabila data dimasukkan ke dalam buffer, hanya 12 bait tinggal tidak digunakan dalam buffer, dengan kedudukan 0-3 diisi oleh nilai yang diberikan, iaitu 82. Lakukan ini untuk semua titik data tanaman yang telah dibaca dan dicatat sebelum ini, sebanyak tiga (3) jumlah. Gunakan fungsi display() dan sertakan buffer untuk memaparkan data yang telah dipakekan.

Berjalan ke tanda X gelap di atas karpet merah dan hadapkan diri ke terminal; di sini kita akan menyah-sandarkan data untuk mengesahkan kandungannya bagi memastikan simpanan yang betul. Cipta tiga pembolehubah bernama: lettuce, carrots dan melons; kita akan menyah-sandarkan data bagi setiap titik data secara individu. Untuk setiap pembolehubah, simpan nilai daripada struct.unpack_from() dan tetapkan argumen dengan menggunakan data yang sama yang anda catat untuk menyandarkan data. Untuk argumen pertama, tetapkan format; yang kedua, sertakan objek buffer sebagai lokasi untuk nyah-sandaran; dan terakhir, tambahkan kedudukan dalam buffer yang ingin anda nyah-sandarkan. Contohnya:

lettuce = struct.unpack_from('i', buffer, 0)

Data ini sepadan dengan contoh pembungkusan sebelum ini apabila disah-sandarkan; lakukan perkara yang sama untuk dua pembolehubah lain dan masukkan lettuce, carrots dan melons ke dalam fungsi write() yang telah ditulis terlebih dahulu untuk menyelesaikan tahap ini.

Buku Kod