Python标准库—pickle/marshal模块

pickle——Python对象序列化

模块pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化。 “Pickling” 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 “unpickling” 是相反的操作,会将(来自一个binary file或者bytes-like object的)字节流转化回一个对象层次结构。

注意:

  1. pickle是Python所独有的,因此非Python程序可能无法重构pickle对象。
  2. 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的区别

  1. marshal不能被用于序列化用户定义类及其实例。pickle 能够透明地存储并保存类实例,然而此时类定义必须能够从与被存储时相同的模块被引入。
  2. 同样用于序列化的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值