Python pickle类库介绍(对象序列化和反序列化)

1327次阅读  |  发布于5年以前

一、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

An arbitrary collection of objects supported by 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 the 'data' dictionary using the highest protocol available.

pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

with open('data.pickle', 'rb') as f:

The protocol version used is detected automatically, so we do not

# have to specify it.  
data = pickle.load(f)  
print(str(data))  

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8