Python 数据持久化 - Marshal 模块


Python标准库中marshal模块的对象序列化功能与pickle模块类似。但是,该模块不用于通用数据。另一方面,Python 本身使用它进行 Python 的内部对象序列化,以支持对 Python 模块(.pyc 文件)的编译版本的读/写操作。

marshal 模块使用的数据格式在 Python 版本之间不兼容。因此,一个版本的已编译 Python 脚本(.pyc 文件)很可能无法在另一版本上执行。

就像 pickle 模块一样,marshal 模块也定义了 load() 和 dump() 函数,用于从文件中读取和写入编组对象。

倾倒()

此函数将支持的 Python 对象的字节表示形式写入文件。文件本身是一个具有写权限的二进制文件

加载()

该函数从二进制文件中读取字节数据并将其转换为Python对象。

以下示例演示了使用 dump() 和 load() 函数来处理 Python 的代码对象,这些对象用于存储预编译的 Python 模块。

该代码使用内置的compile()函数从嵌入Python指令的源字符串构建代码对象。

compile(source, 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)