pickle——Python对象序列化
模块pickle
实现了对一个 Python 对象结构的二进制序列化和反序列化。 “Pickling” 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 “unpickling” 是相反的操作,会将(来自一个binary file或者bytes-like object的)字节流转化回一个对象层次结构。
注意:
- pickle是Python所独有的,因此非Python程序可能无法重构pickle对象。
- pickle模块在接受被错误地构造或者被恶意地构造的数据时不安全。永远不要 unpickle 来自于不受信任的或者未经验证的来源的数据。
常量
-
pickle.HIGHEST_PROTOCOL
整数,可用的最高协议版本。此值可以作为 协议 值传递给
dump()
和dumps()
函数,以及Pickler
的构造函数。 -
pickle.DEFAULT_PROTOCOL
一个整数,表示默认的协议版本,Python3默认的是协议3。
协议版本
- v0 版协议是原始的“人类可读”协议,并且向后兼容早期版本的 Python。
- v1 版协议是较早的二进制格式,它也与早期版本的 Python 兼容。
- v2 版协议是在 Python 2.3 中引入的。它为存储 new-style class 提供了更高效的机制。欲了解有关第 2 版协议带来的改进,请参阅 PEP 307。
- v3 版协议添加于 Python 3.0。它具有对
bytes
对象的显式支持,且无法被 Python 2.x 打开。这是目前默认使用的协议,也是在要求与其他 Python 3 版本兼容时的推荐协议。 - v4 版协议添加于 Python 3.4。它支持存储非常大的对象,能存储更多种类的对象,还包括一些针对数据格式的优化。有关第 4 版协议带来改进的信息,请参阅 PEP 3154。
protocol值越大,dump的速度越快,并且支持的数据类型更多,保存下来的文件占用空间更小,同时也带来一些其他优化,例如在python3.4中,协议版本4新支持对非常大的数据进行序列化。因此可以的话,请选择最高协议版本作为protocol参数的值,即设protocol=pickle.HIGHEST_PROTOCOL即可。
dumps&loads
>>> import pickle
>>>
>>> L = [1,2,3,4,5,6]
>>> b = pickle.dumps(L)
>>> b
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05K\x06e.'
>>> pickle.loads(b)
[1, 2, 3, 4, 5, 6]
>>>
dump&load
>>> data = [1,2,3,4,5,6]
>>> with open("data.pickle",'wb') as f:
... pickle.dump(data, f)
...
>>> with open("data.pickle",'rb') as f:
... load_data = pickle.load(f)
...
>>> load_data
[1,2,3,4,5,6]
>>>
marshal——内部Python对象序列化
marshal不是一般的“持久性”模块,该模块主要用于支持读取和编写Python模块的.pyc
文件的“伪编译”代码。
marshal与pickle的区别
- marshal不能被用于序列化用户定义类及其实例。
pickle
能够透明地存储并保存类实例,然而此时类定义必须能够从与被存储时相同的模块被引入。 - 同样用于序列化的
marshal
格式不保证数据能移植到不同的 Python 版本中(即marshal不保证能跨版本)。因为它的主要任务是支持.pyc
文件,必要时会以破坏向后兼容的方式更改这种序列化格式,为此 Python 的实现者保留了更改格式的权利。pickle
序列化格式可以在不同版本的 Python 中实现向后兼容,前提是选择了合适的 pickle 协议。
注意:marshal不是一个通用的序列化模块,不同版本的Python对应的marshal不保证相同
函数/属性 | |
---|---|
marshal.dumps(value[, version]) | 将值转化为bytes对象 |
marshal.loads(bytes) | 将 bytes-like object转换为值 |
marshal.dump(value, file[, version]) | 将值写入二进制文件 |
marshal.load(file) | 将二进制文件内容转换为值 |
marshal.version | 指示模块使用的格式 |
marshal.version
- 版本0是历史格式
- 版本1共享内部字符串
- 版本2对浮点数使用二进制格式
- 版本3增加了对对象实例化和递归的支持
- 当前版本为4