- 1.概述
- 2.dump()方法-序列化
- 3.load()方法-反序列化
- 4.注意事项
- 5.作者答疑
在Python开发过程中,如果希望透明地存储 Python 对象,而不丢失其身份和类型等信息,则需要某种形式的对象序列化:它是一个将任意复杂的对象转成对象的文本或二进制表示的过程。同样,必须能够将对象经过序列化后的形式恢复到原有的对象。在 Python 中,这种序列化过程称为 pickle,可以将对象 pickle 成字符串、磁盘上的文件或者任何类似于文件的对象,也可以将这些字符串、文件或任何类似于文件的对象 unpickle 成原来的对象。 缺点:只用 pickle 是不能解决命名和查找 pickle 文件这样的问题,另外,它也不能支持并发地访问持久性对象。如果需要更复杂的面向对象存储,需要采用python中的面向对象数据库来支持。
在pickle中两个最常用的函数,一个是dump函数,用于序列化;另一个是load函数,用于反序列化。
2.dump()方法-序列化pickle.dump(obj, file, [,protocol]) 注释:序列化对象,将对象obj保存到文件file中去。参数protocol是序列化模式,默认是0(ASCII协议,表示以文本的形式进行序列化),protocol的值还可以是1和2(1和2表示以二进制的形式进行序列化。其中,1是老式的二进制协议;2是新二进制协议)。file表示保存到的类文件对象,file必须有write()接口,file可以是一个以"w"打开的文件或者是一个StringIO对象,也可以是任何可以实现write()接口的对象。
3.load()方法-反序列化pickle.load(file) 注释:反序列化对象,将文件中的数据解析为一个python对象。file中有read()接口和readline()接口。
import pickle
def get_label_dict():
fr=open('./chinese_labels_py3.txt', 'rb');#尽量采用二进制,文本编码,存在编码转换与选择问题
label_dict = pickle.load(fr);#反序列化
fr.close();
fw = open('chinese_labels_py3.txt', 'wb');
pickle.dump(label_dict,fw,1);#序列化
fw.close();
return label_dict;
get_label_dict();
4.注意事项
在使用中,需要注意到的几个问题。 1.pickle支持循环引用和递归引用。 2.不可 pickle 的对象:一些对象类型是不可 pickle 的。例如,Python 不能 pickle 文件对象(或者任何带有对文件对象引用的对象),因为 Python 在 unpickle 时不能保证它可以重建该文件的状态。 3.可移植性:从空间和时间上说,Pickle 是可移植的。换句话说,pickle 文件格式独立于机器的体系结构,这意味着,例如,可以在 Linux 下创建一个 pickle,然后将它发送到在 Windows 或 Mac OS 下运行的 Python 程序。并且,当升级到更新版本的 Python 时,不必担心可能要废弃已有的 pickle。Python 开发人员已经保证 pickle 格式将可以向后兼容 Python 各个版本。事实上,在 pickle 模块中提供了有关目前以及所支持的格式方面的详细信息。
5.作者答疑如有疑问,敬请留言。