Python 数据持久化 - Marshal 模块
Python 标准库中的marshal 模块的对象序列化特性与pickle 模块类似。 但是,此模块不用于通用数据。 另一方面,它被 Python 本身用于 Python 的内部对象序列化,以支持对已编译版本的 Python 模块(.pyc 文件)的读/写操作。
marshal 模块使用的数据格式与 Python 版本不兼容。 因此,一个版本的已编译 Python 脚本(.pyc 文件)很可能不会在另一个版本上执行。
就像 pickle 模块一样,marshal 模块也定义了 load() 和 dump() 函数,用于从文件读取和写入编组对象。
dump()
此函数将受支持的 Python 对象的字节表示写入文件。 该文件本身是一个具有写权限的二进制文件
load()
此函数从二进制文件中读取字节数据并将其转换为 Python 对象。
以下示例演示了使用 dump() 和 load() 函数来处理 Python 代码对象,这些代码对象用于存储预编译的 Python 模块。
该代码使用内置的 compile() 函数从嵌入 Python 指令的源字符串构建代码对象。
compile(source, file, mode)
file 参数应该是从中读取代码的文件。 如果它不是从文件中读取的,则传递任意字符串。
如果源包含语句序列,则模式参数为"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)