python pickle module
一、pickle模块概述
pickle 这个单词的中文意思为 n. 腌菜,泡菜;腌制食品; v. 腌渍
腌菜是为了长期保存蔬菜,在以前没有冰箱等冷藏技术的时代,一般在秋天腌制蔬菜以便在冬天吃,pickle模块的作用类似于腌菜的作用。
pickle模块实现了一个基本但强大的算法,用于对Python对象结构进行序列化(serializing)和反序列化(de-serializing)
序列化:它是一个将任意复杂的对象转成对象的文本或二进制表示的过程,对应pickle模块中的dump()函数,简单的说,就是将一个复杂的对象用简单的方法保存至磁盘文件,长期存储。 反序列化:将对象经过序列化后的形式恢复到原有的对象的过程,对应pickle模块中的load()函数,从硬盘文件恢复原来的数据对象。
cPickle模块是pickle模块的一个优化版本,cPickle使用C语言实现,它比pickle快1000倍,cPickle和pickle有微小的差别,具体请查看文档。
二、cPickle操作函数
1. dump(obj, file[, protocol])
obj: 输出到文件的数据对象 file: 已打开的文件句柄(描述符),并且此file可写 protocol: 默认是0,表示以文本的形式写入file。protocol的值还可以是负数,表示以二进制的形式写入file。
dump()函数会在pickle文件中标识每次写入对象的数据类型,两次dump()操作写入的对象在文件中有特定的分隔符来标识,通过查看写入的pickle文件,分隔符好像是 ‘.’
- load(file)
file: file: 已打开的文件句柄(描述符)
load()返回的对象是dump()一次写入的对象,load函数从pickle文件顺序读取。
3.dumps(obj[, protocol])
参数含义同dump(),不同的是该函数不写入文件,而是返回一个string对象
4.loads(string)
从dumps()返回的string对象获得原始的数据
三、测试cPickle
import cPickle,pprint class Student(): def __init__(self,sno="0", name="sword", age=20): self.sno = sno self.name = name self.age = age def printStudent(self): print("sno:%s\nname:%s\nage:%d\n" %(self.sno,self.name,self.age)) #dump print("----dump----") fp = open("data.pk","wb") x=[1,[2,[3,[4,'a','b']]]] cPickle.dump(x,fp) for i in range(3): cPickle.dump("hello,pickle",fp) cPickle.dump(i,fp) stu = Student("2014001","geekSword",23) cPickle.dump(stu, fp) fp.close() #load print("----load----") fp = open("data.pk","rb") x=cPickle.load(fp) pprint.pprint(x) for i in range(3): print(cPickle.load(fp)) print(cPickle.load(fp)) s = Student() s.printStudent() s = cPickle.load(fp) s.printStudent() fp.close() #dumps print("----dumps & loads----") str = cPickle.dumps(stu) print(str) s = cPickle.loads(str) s.printStudent()
四、pickle文件分析
(lp1 I1 a(lp2 I2 a(lp3 I3 a(lp4 I4 aS’a’ aS’b’ aaaa.
这是列表x=[1,[2,[3,[4,’a’,’b’]]]]在pk文件中的形式,猜测各种符号的含义:
lp[1-4] 表示列表的深度,首字母’l’表明这是一个list对象 I 表示后面的内容为整数aS 表示后面的内容为字符 a( 和 a 表示一对 [] . 最后的 . 表示一次dump操作的结束(一个数据对象的结束,分隔)
S’hello,pickle’
这是dump(“hello,pickle”, fp)结果在pk文件中的形式 大S表示后面的内容是一个string对象
(i__main__ Student p1 (dp2 S’sno’ p3 S’2014001′ p4 sS’age’ p5 I23 sS’name’ p6 S’geekSword’ p7 sb.
这是自定义对象stu在pk文件中的形式。
留下评论