Persistensi Data Python - Modul Marshal

Fitur serialisasi objek modul marshal di pustaka standar Python mirip dengan modul acar. Namun, modul ini tidak digunakan untuk data tujuan umum. Di sisi lain, ini digunakan oleh Python sendiri untuk serialisasi objek internal Python untuk mendukung operasi baca / tulis pada versi terkompilasi dari modul Python (file .pyc).

Format data yang digunakan oleh modul marshal tidak kompatibel di semua versi Python. Oleh karena itu, skrip Python yang dikompilasi (file .pyc) dari satu versi kemungkinan besar tidak akan dijalankan di versi lain.

Sama seperti modul acar, modul marshal juga mendefinisikan fungsi load () dan dump () untuk membaca dan menulis objek yang tersusun dari / ke file.

membuang()

Fungsi ini menulis representasi byte dari objek Python yang didukung ke sebuah file. File itu sendiri menjadi file biner dengan izin menulis

beban()

Fungsi ini membaca data byte dari file biner dan mengubahnya menjadi objek Python.

Contoh berikut menunjukkan penggunaan fungsi dump () dan load () untuk menangani objek kode Python, yang digunakan untuk menyimpan modul Python yang telah dikompilasi sebelumnya.

Kode menggunakan built-in compile() berfungsi untuk membuat objek kode dari string sumber yang menyematkan instruksi Python.

compile(source, file, mode)

Parameter file haruslah file dari mana kode itu dibaca. Jika tidak dibaca dari file, berikan string arbitrer apa pun.

Parameter mode adalah 'exec' jika sumber berisi urutan pernyataan, 'eval' jika ada satu ekspresi atau 'single' jika berisi satu pernyataan interaktif.

Objek kode kompilasi kemudian disimpan dalam file .pyc menggunakan fungsi dump ().

import marshal
script = """
a=10
b=20
print ('addition=',a+b)
"""
code = compile(script, "script", "exec")
f=open("a.pyc","wb")
marshal.dump(code, f)
f.close()

Untuk melakukan deserialisasi, objek dari file .pyc menggunakan fungsi load (). Karena, ini mengembalikan objek kode, itu bisa dijalankan menggunakan exec (), fungsi bawaan lainnya.

import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)