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
领取专属 10元无门槛券
私享最新 技术干货