pickle是标准库中的一个模块,还有跟它完全一样的叫作
cpickle,两者的区别就是后者更快,所以,在操作中,不管是用import pickle,还是用import cpickle as pickle,在功能上都是一样的。
>>> import
pickle
>>> a = [1,2,3,4,5]
>>> f = open("D://test.txt","wb")
>>>
pickle
.
dump
(a,f) #文件中以ascii格式保存数据
>>> f.close()
用pickle.dump(a,f)将数据integers保存到文件D://test.txt中。打开文件会发现都是编码,这个步骤可以称之为将
对象序列化。
用到的方法是:
pickle.dump(obj,file,protocol)。
obj:序列化对象,在上面的例子中是一个列表,它是基本类型,也可以序列化自己定义的类型。
file:要写入的文件。可以更广泛地理解为拥有write()方法的对象,并且能接受字符串为参数,所以,它还可以是一个StringIO对象,或者其他自定义满足条件的对象。
protocol:可选项。默认为False(或者说0),以ASCII格式保存对象;如果设置为1或者True,则以压缩的二进制格式保存对象。
换一种数据格式,来对比一下:
>>> f = open("D://test1.txt","wb")
>>>
pickle.dump
(a,f,
True
) #文件中以二进制格式保存数据
>>> f.close()
>>> import os
>>> s1 = os.stat("D://test.txt").st_size #计算两个文件的大小
>>> s2 = os.stat("D://test1.txt").st_size
>>> print "s1= %d ,s2= %d "%(s1,s2)
s1= 26 ,s2= 16
发现,以二进制方式保存的文件比以ASCII格式保存的文件小很多,所以,在序列化的时候,特别是面对较大对象时,建议将dump()的参数True设置上
存储文件叫序列化,读取文件就叫反序列化:
>>> f = open("D://test.txt","rb")
>>> a =
pickle.load
(f) #反序列化,读取文件
>>> print a
[1, 2, 3, 4, 5]
再试试读取二进制存储的文件:
>>> f = open("D://test1.txt","rb")
>>> a =
pickle.load
(f) #读取
>>> print a
[1, 2, 3, 4, 5]
>>> f.close()
下面试试自定义数据类型:
>>> import
cPickle as pickle
#和pickle一样,但cPickle更快
>>> import
StringIO
#跟file功能类似,只不过是在内存中操作“文件”
>>> class Person(object):
def __init__(self,name):
self.name = name
def getName(self):
print "My name is ",self.name
>>> pName = Person("zhangsan")
>>> pName.getName()
My name is zhangsan
>>> f =
StringIO.StringIO
() #和file的open功能一样,这是直接再内存中操作
>>>
pickle.dump
(pName,f,True) #序列化存储
>>>
f.seek(0)
#找到对应类型
>>> pName1 =
pickle.load
(f) #读取
>>> pName1.getName()
My name is zhangsan
>>> f.close()