一,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()