Python 資料持久化 - marshal 模組



Python 標準庫中 marshal 模組的物件序列化功能類似於 pickle 模組。但是,此模組不用於通用資料。另一方面,Python 本身使用它來進行 Python 內部物件序列化,以支援對 Python 模組的編譯版本(.pyc 檔案)的讀/寫操作。

marshal 模組使用的資料格式在不同的 Python 版本之間不相容。因此,一個版本的編譯 Python 指令碼(.pyc 檔案)很可能無法在另一個版本上執行。

與 pickle 模組一樣,marshal 模組也定義了 load() 和 dump() 函式,用於從檔案讀取和寫入 marshalled 物件。

dump()

此函式將支援的 Python 物件的位元組表示形式寫入檔案。該檔案本身應為具有寫入許可權的二進位制檔案。

load()

此函式從二進位制檔案讀取位元組資料,並將其轉換為 Python 物件。

以下示例演示瞭如何使用 dump() 和 load() 函式來處理 Python 的程式碼物件,這些程式碼物件用於儲存預編譯的 Python 模組。

該程式碼使用內建的 compile() 函式根據包含 Python 指令的源字串構建程式碼物件。

compile(source, file, mode)

file 引數應該是讀取程式碼的檔案。如果它不是從檔案讀取的,則傳遞任何任意字串。

如果源包含語句序列,則 mode 引數為 'exec';如果只有一個表示式,則為 'eval';如果包含單個互動式語句,則為 'single'。

然後使用 dump() 函式將編譯的程式碼物件儲存在 .pyc 檔案中。

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()

要反序列化 .pyc 檔案中的物件,請使用 load() 函式。由於它返回一個程式碼物件,因此可以使用 exec()(另一個內建函式)執行它。

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