一、pickle
pickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。
python对象与文件之间的序列化和反序列化:
复制代码 代码如下:
pickle.dump()
pickle.load()
如果要实现python对象和字符串间的序列化和反序列化,则使用:
复制代码 代码如下:
pickle.dumps()
pickle.loads()
可以被序列化的类型有:
注意:对于函数或类的序列化是以名字来识别的,所以需要import相应的module。
二、pickle的运行过程
在大部分情况下,要是的对象picklable,我们不需要额外的代码。默认地pickle将智能地检查类和实例的属性,当一个类实例反序列化的时候,它的init()方法通常不被调用。而是首先创建一个未初始化的实例,然后再回复存储的属性。
但是可以通过实现下列的方法来修改默认的行为:
复制代码 代码如下:
object.getstate() :默认地序列化对象的dict,但是如果你实现了getstate(),则getstate()函数返回的值将被序列化。
object.setstate(state) :如果类型实现了此方法,则在反序列化的时候,此方法用来恢复对象的属性。
object.getnewargs() : 如果实例构造的时候(new())需要参数,则需要实现此函数。
注意:如果getstate()返回False,则在反序列化的时候setstate()则不被调用。
有的时候为了效率,或上面的3个函数不能满足需求时,需要实现reduce()函数。
三、实例
复制代码 代码如下:
import pickle
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': set([None, True, False])
}
with open('data.pickle', 'wb') as f:
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
with open('data.pickle', 'rb') as f:
# have to specify it.
data = pickle.load(f)
print(str(data))
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8