Kursus Pembangunan Python Lanjutan
Bab
>
Tahap
Modul Serialisasi
Modul Marshal dan Pickle
Objektif
Pergilah ke stesen servis dan pastikan data disimpan dengan betul dengan menggunakan modul JSON untuk memformat fail.
Sambil meneruskan di sepanjang jalan, kita mendapati beberapa stesen yang memantau pengagihan air dan kualiti tanah untuk tanah yang sedang dibangunkan untuk menuai di masa hadapan. Untuk memproses data, adalah lebih berkesan untuk menyeriakan data. Walaupun penggunaan JSON boleh menjadi penyelesaian am yang berkesan, terdapat juga beberapa kaedah penyeriakan khusus Python, iaitu modul Marshal dan Pickle. Modul Marshal direka untuk menyeriakan/deseriakan dengan cepat dengan menukar data ke dalam bentuk binari, sesuai untuk pemindahan data yang lebih ringkas. Modul Pickle adalah lebih perlahan tetapi direka untuk memproses struktur data yang lebih kompleks dan lebih fleksibel, sesuai untuk struktur data yang lebih besar atau bernilai keutamaan.
Untuk menggunakan modul Marshal dan Pickle, import fungsi mereka dengan menulis: import marshal dan import pickle. Bagi tujuan kita, kita akan menggunakan fungsi-fungsi berikut:
marshal.dumps(): Menyeriakan data ke dalam format binari, direka untuk kelajuan dalam Python. Menerima satu argumen, iaitu data yang anda ingin serialisasikan, terhad kepada jenis data asas.marshal.loads(): Mendeseriakan data binari menjadi jenis data yang boleh dibaca oleh Python, terhad dalam keupayaannya tetapi lakuannya pantas. Menerima satu argumen, iaitu data yang hendak diserialisasikan.pickle.DEFAULT_PROTOCOL: Menyemak versi protokol untuk serialisasi Pickle yang digunakan sebagai lalai dalam versi Python anda. Protokol-protokol ini mempengaruhi cara data diserialisasikan.pickle.HIGHEST_PROTOCOL: Menyemak versi protokol untuk serialisasi Pickle yang tertinggi tersedia dalam versi Python anda. Protokol-protokol ini mempengaruhi cara data diserialisasikan.pickle.dumps(): Menyeriakan struktur data Python yang kompleks dalam format binari mengikut protokol yang digunakan. Menerima dua argumen, data yang anda ingin serialisasikan dan versi protokol yang anda ingin gunakan semasa serialisasi.pickle.loads(): Mendeseriakan data binari menjadi jenis data yang boleh dibaca oleh Python, dengan keupayaan yang mantap untuk objek Python. Menerima satu argumen, iaitu data yang anda ingin deserialisasikan.
Selain modul dan fungsi-fungsi ini, kita juga akan menggunakan modul pemformatan bernama pformat, yang akan kita import menggunakan from pprint import pformat. Ini membolehkan kita menggunakan fungsi pformat() yang boleh digunakan untuk memformat struktur data seperti kamus, membolehkan kita memaparkan maklumat dengan jelas.
Untuk memulakan, berjalanlah ke tanda X cahaya di dalam stesen pemantauan kecil dan hadap ke terminal komputer. Stesen ini memantau tekanan air dan keadaan tanah pada kawasan berdekatan yang sedang dibangunkan untuk penanaman tanaman. Terdapat satu konstan bernama reading, yang mengandungi data Python yang dikumpulkan oleh stesen.
Cipta satu pembolehubah bernama data dan simpan nilai fungsi marshal.dumps() dengan menetapkan reading sebagai argumen. Contohnya: data = marshal.dumps(reading). Gunakan pembolehubah data dengan fungsi display() yang telah disediakan untuk melihat data pembolehubah yang telah diseriakan.
Keluar dari stesen dan menuju ke tanda X emas, gunakan fungsi open() untuk membuka pintu dan mendapat akses ke pejabat. Berjalan ke tanda X cahaya di hadapan terminal, dan deserialisasikan data yang baru anda serialisasikan. Cipta satu pembolehubah bernama output dan simpan nilai marshal.loads() dengan pembolehubah data sebelumnya sebagai argumen. Gunakan fungsi write() dan tambah output sebagai argumen untuk mengakses data yang telah diseriakan yang anda kumpulkan dari stesen pemantauan.
Berjalan ke tanda X cahaya di atas karpet biru di pejabat, di terminal kita akan mengesahkan protokol untuk menentukan jenis serialisasi yang akan digunakan oleh modul pickle semasa memproses data. Dalam fungsi write() yang telah disediakan, tetapkan argumen sebagai pickle.DEFAULT_PROTOCOL dan pickle.HIGHEST_PROTOCOL. Ini akan mengesahkan apa protokol serialisasi semasa serta protokol serialisasi terkini yang tersedia pada masa ini.
Bergerak ke tanda X gelap di atas karpet biru, sekarang setelah kita mengesahkan protokol, kita kini boleh mengesahkan data yang disimpan. Data telah dikumpulkan dan disimpan sepanjang bulan-bulan dan disimpan dalam konstanta bernama samples. Cipta tiga pembolehubah bernama: sereal_0, sereal_2 dan sereal_5 yang akan kita gunakan untuk mengesahkan tiga protokol yang tersedia untuk serialisasi. Protokol 0 adalah ASCII yang boleh dibaca, tidak begitu berkesan, Protokol 2 adalah format binari yang lebih berkesan dan Protokol 5 adalah terkini dengan ciri-ciri paling kompleks yang ditambah.
Kita akan menyimpan nilai pickle.dumps() dan menetapkan sebagai argumen, konstanta samples dan protocol yang sepadan dengan nombor pada nama pembolehubah. Sebagai contoh, untuk sereal_0 kita akan menetapkan protocol sebagai 0, seperti berikut: sereal_0 = pickle.dumps(samples, protocol=0). Gunakan sereal_0, sereal_2 dan sereal_5 dengan fungsi display() yang telah disediakan untuk mengesahkan perbezaan serialisasi bagi setiap protokol.
Berjalan ke tanda X cahaya di atas karpet merah dan hadap ke terminal, timpa pembolehubah output dan simpan nilai pickle.loads() dengan menetapkan argumennya kepada sereal_5 untuk mendeserialisasikan data sampel yang telah dikumpulkan setakat ini. Gunakan fungsi display() dan tambah fungsi pformat() dengan pembolehubah output untuk melihat data tersebut. Contohnya: await player.display(pformat(output)). Catat penilaian untuk setiap bulan yang dipaparkan di terminal supaya anda boleh mencatatkannya kemudian.
Berjalan ke tanda X gelap di atas karpet merah dan hadap ke meja, pada fungsi write() yang telah disediakan, tambahkan penilaian yang telah anda catat untuk setiap bulan, yang sebelum ini dipaparkan di terminal. Tambahkan mereka sebagai rentetan dengan tanda "" dalam urutan yang betul seperti yang dinyatakan dalam fungsi untuk melengkapkan tahap tersebut.