序列化(picking): 把变量从内存中变成可存储或传输的过程称为序列化,序列化之后,就可以把序列化的对象写入磁盘,或者传输给其他设备;

反序列化(unpickling):相应的,把变量的内容从序列化的对象重新读到内存里的过程称为反序列化;


python中有两个模块可以实现对象的序列化,pickle和cPickle(注意P大写),cPickle是用C语言实现的,pickle是用纯python语言实现的,相比,cPickle的读写效率高一些。

使用的时候,一般先尝试导入cPickle,如果失败,再导入pickle模块。

try:
    import cPickle as pickle
except ImportError:
    import pickle


可以被pickle模块存储的对象类型:
所有Python支持的 原生类型 : 布尔, 整数, 浮点数, 复数, 字符串, bytes(字节串)对象, 字节数组, 以及 None.
–由任何原生类型组成的列表,元组,字典
–由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).
–函数,类,和类的实例(带警告)。

pickle模块中主要的函数是dump()/load()和dumps()/loads()。

dump()实现把一个对象序列化之后以特定的格式保存到指定的文件中,dumps()实现把一个对象转化为序列化之后的str数据,然后可以对这个str数据进行其他处理或者把这个str数据写入文件;

load()实现把一个已经序列化并写入文本中的对象反序列化成内存中的对象,loads()实现把一个反序列化的str对象反序列化成内存中的对象。

dir = {bird:0,pig:1,cat:2,dog:3}
f = open('animal.pkl','wb')
pickle.dump(dir,f)
f.close

在程序所在目录下生成animal.pkl文件,保存的是dir内存对象的序列化后的信息。

f = open('animal.pkl', 'rb')
d = pickle.load(f)
f.close()
print d

load()返回从加载的文件中反序列化出的对象,d中的内容就是dir中的内容。


dumps()/loads()用法:

dir = {'bird':0,'pig':1,'cat':2,'dog':3}
ds = pickle.dumps(dir)
print ds
ls = pickle.loads(ds)
print ls

ds中的内容就是dir序列化后的对象,ls中的内容就是ds反序列化之后的对象,ls跟dir保持一致。


dump()和load()函数的参数也可以合并写为pickle.dump(dir,open('animal.pkl','wb'))和pickle.load(open('animal.pkl', 'rb'))


posted on 2017-10-09 11:14  未雨愁眸  阅读(640)  评论(0编辑  收藏  举报