在Python中,如果希望透明地存储对象,而不丢失其身份和类型等信息,则需要某种形式的对象序列化,这是一个将任意复杂的对象转成对象的文本和二进制表示的过程。同样,必须能够将对象经过序列化后的形式恢复到原来的对象。这种序列化的过程称为pickle,可以将对象pickle成字符串、磁盘上的文件或者任何类似于文件的对象;反序列化的过程就是将这些字符串、文件或任何类似于文件的对象unpickle成原来的对象。
pickle模块提供了以下函数对:dumps(object)返回一个字符串,它包含了一个pickle格式的对象;loads(string)返回包含在pickle字符串中的对象;dump(object,file)将对象写到文件,这个文件可以是实际的物理文件,也可以是类似于文件的对象,这个对象具有write()方法,可以接受单个的字符串参数;load(file)返回包含在pickle文件中对象。
缺省情况下,dumps()和dump()使用可打印的ASCII表示来创建pickle。两者都有一个final参数,这个参数是可选的,若这个参数为True,则该参数指定用更快更小的二进制表示来创建pickle。loads()和load()则会自动检测pickle是二进制格式还是文本格式。在实际使用复杂对象的系统中,使用二进制格式可以在大小和速度方面带来显著的改进。
下面看一个对象保存为一个字符串的例子:
>>> import pickle
>>> a1 = ("pickle",123,[4,5,6],{'A':1,'B':2})
>>> p1 = pickle.dumps(a1)
>>> a2 = pickle.loads(p1)
如果用更高效 的二进制来存储:
>>> import pickle
>>> a1 = ("pickle",123,[4,5,6],{'A':1,'B':2})
>>> p1 = pickle.dumps(a1,True)
>>> a2 = pickle.loads(p1)
也可以将对象保存在磁盘文件中:
>>> import pickle
>>> a1 = ("pickle",123,[4,5,6],{'A':1,'B':2})
>>> with open('text.txt','wb') as file:
>>> pickle.dump(a,file)
>>> with open('text.txt','rb') as file2:
>>> a2 = pickle.load(file2)
值得一提的是,pickle 模块及其同类模块 cPickle 向 Python 提供了 pickle 支持。后者是用 C 编码的,它具有更好的性能,对于大多数应用程序,推荐使用该模块。
这里补充说一下joblib库,这个库是由scikit-learn外带的,scikit-learn库是机器学习的一个库,研究机器学习的童鞋都知道。引入joblib库也很简单,前提是安装了scikit-learn库:
>>> import sklearn
>>> from sklearn.externals import joblib
对于大数据而言,joblib比pickle更加高效,但是joblib只能将对象存储在磁盘文件中,不能保存为字符串。
参考文献(该参考文献中博主讲的非常透彻):
http://www.cnblogs.com/cobbliu/archive/2012/09/04/2670178.html