一,Python标准库提供pickle和cPickle模块。cPickle是用C编码的,在运行效率上比pickle要高,但是cPickle模块中定义的类型不能被继承(其实大多数时候,我们不需要从这些类型中继承,推荐使用cPickle)。cPickle和pickle的序列化/反序列化规则是一样的,使用pickle序列化一个对象,可以使用cPickle来反序列化。


二,


1.loads/dumps 以字符串的形式保存在内存

[python] 

obj={"aa":3,"bb":[1,4,5,]}  

s=pickle.dumps(obj)  

print s  

newobj=pickle.loads(s)  

print newobj 


dumps(object) 返回一个字符串,它包含一个 pickle 格式的对象; 

loads(string) 返回包含在 pickle 字符串中的对象;


2.load/dump 以二进制形式保存到文件

[python] 

f=open("test1.dat","w+")  

pickle.dump(obj,f)  

f.flush()  

f.seek(0)  

newobj=pickle.load(f)  

print newobj  

f.close()  


dump(object, file) 将对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象,这个对象具有 write() 方法,可以接受单个的字符串参数; 

load(file) 返回包含在 pickle 文件中的对象。



三,缺省情况下, dumps() 和 dump() 使用可打印的 ASCII 表示来创建 pickle。两者都有一个 final 参数(可选),如果为 True ,则该参数指定用更快以及更小的二进制表示来创建 pickle。

loads() 和 load() 函数自动检测 pickle 是二进制格式还是文本格式。


t1 = ('this is a string', 42, [1, 2, 3], None)

t1

Out[16]: ('this is a string', 42, [1, 2, 3], None)


p1 = pickle.dumps(t1)

p1

Out[18]: b'\x80\x03(X\x10\x00\x00\x00this is a stringq\x00K*]q\x01(K\x01K\x02K\x03eNtq\x02.'


p2 = pickle.dumps(t1, True)

p2

Out[25]: b'(X\x10\x00\x00\x00this is a stringq\x00K*]q\x01(K\x01K\x02K\x03eNtq\x02.'



四,dump() 函数能一个接着一个地将几个对象转储到同一个文件。

    随后调用 load() 来以同样的顺序检索这些对象。

 


a1 = 'apple'

b1 = {1: 'One', 2: 'Two', 3: 'Three'}

c1 = ['fee', 'fie', 'foe', 'fum']

f1 = open('temp.pkl', 'wb')

pickle.dump(a1, f1, True)

pickle.dump(b1, f1, True)

pickle.dump(c1, f1, True)

f1.close()

f2 = open('temp.pkl', 'rb')

a2 = pickle.load(f2)

a2

Out[39]: 'apple'

b2 = pickle.load(f2)

b2

Out[41]: {1: 'One', 2: 'Two', 3: 'Three'}

c2 = pickle.load(f2)

c2

Out[43]: ['fee', 'fie', 'foe', 'fum']

f2.close()