Python基础知识之模块——Pickle

Pickle模块用于将python对象序列化为字节流,可存储在文件或数据库中,也可同通过网络进行传输。使用反序列化(Unpickle)可以将生成的字节流转换回python对象。

什么叫序列化?

把对象在内存中的结构转换成便于存储或传输的二进制或文本格式,而且以后可以在同一个系统或不同的系统中重建对象的副本。pickle模块能把任何Python对象序列化成二进制格式。

假设有一个庞大的字典对象或者类对象(比如员工信息)需要存储在文件中,然后在需要的时候取出来直接使用,或者传递给别人使用。这时就可以方便地使用Pickle模块下的方法。

pickle模块下的方法

这里只简要列出用法,具体参数请查阅官方文档.

接受至少2个参数,obj和file,作用是将对象obj序列化为字节流后保存在文件file中.如果对象不支持序列化则引发pickle.PicklingError异常

与dump()类似,但是返回一个包含已序列化数据的字节流。

从文件里读取并还原已序列化的对象,如果该文件包含无法解码的数据则引发pickle.UnpicklingError异常,如果检测到文件结尾,则引发EOFError异常。

与load()类似,但是从字节流读取一个对象的序列化表示形式。

pickle模块下的两个类

利用Pickler可以创建序列化的对象,为了写入字节流需要指定一个二进制格式的文件file。

Pickler类实例化的方法:

假设创建对象P = pickle.Pickler(file)

可将对象obj写入文件file,写入后,会记住它的身份。如果再次使用p.dump()操作写入相同的对象,则保存前面已写入对象的引用,而不是创建新的副本。除非使用clear_memo()方法清除记忆。

该方法清除用于跟踪前面已写入对象的内部字典。如果想要写入一个相同对象的新副本,则需要在两条语句之间使用该指令。

利用Unpickler可以根据相关参数创建反序列化的对象,为了读取字节流需要指定一个二进制格式的文件file。

Unpickler类实例化的方法:

假设创建对象P = pickle.Unpickler(file)

返回一个新的对象,Unpickler会跟踪其返回的对象,因为在其被序列化时可能包含由Pickler对象创建的对象引用,如果判断该对象在写入时没有创建新的副本(也就是说写入时是对同一个对象执行了两次语句,并且没有清除引用记忆),这时该语句会返回一个前面已经加载的对象的引用

最后这几条语句解释起来有些绕口,我们来举个例子:

第一种情况:对同一个已序列化对象执行了3次写入操作,并且没有使用clear_memo()方法。

然后我们在另一个程序反序列化读取这三条写入的记录,并且打印出他们的内存地址。

从结果可以看出,这三个对象的ID相同,都是指向的同一个内存地址,也就是说后面两条读取语句只是返回前面已加载的对象的引用。

然后再看看使用clear_memo()方法的结果:

然后我们来看看反序列化的结果:

从结果可以看出,这三个对象的的内存地址各不相同,也就是分别对同一个对象创建了三个副本.

参考资料:

[美]大卫 M.比兹利(David M.Beazley). Python参考手册 第4版 修订版 人民邮电出版社.

Luciano Ramalho. 流畅的Python. 人民邮电出版社.

欢迎关注我的公众号,谢谢!

封面Photo byMarkus SpiskeonUnsplash

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181013G144TO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券