原文地址:http://docs.pythontab.com/learnpython/
# pickle
# import pickle/import cpickle as pickle
# 1
>>> import pickle
>>> integers = [1, 2, 3, 4, 5]
>>> f = open("22901.dat", "wb")
>>> pickle.dump(integers, f)
>>> f.close()
# €]q (KKKKKe.
'''
pickle.dump(obj,file[,protocol])
obj:序列化对象,上面的例子中是一个列表,它是基本类型,也可以序列化自己定义的类型。
file:一般情况下是要写入的文件。更广泛地可以理解为为拥有write()方法的对象,并且能接受字符串为为参数,所以,它还可以是一个StringIO对象,或者其它自定义满足条件的对象。
protocol:可选项。默认为False(或者说0),是以ASCII格式保存对象;如果设置为1或者True,则以压缩的二进制格式保存对象。
'''
# 2
import pickle
d = {}
integers = [x for x in range(9999)]
d['i'] = integers #下面将这个dict格式的对象存入文件
f = open("22902.dat", "wb")
pickle.dump(d, f) #文件中以ascii格式保存数据
f.close()
f = open("22903.dat", "wb")
pickle.dump(d, f, True) #文件中以二进制格式保存数据
f.close()
import os
s1 = os.stat("22902.dat").st_size #得到两个文件的大小
s2 = os.stat("22903.dat").st_size
print("%d, %d, %.2f%%" % (s1, s2, (s2+0.0)/s1*100))
# 二进制方式保存的文件比以ascii格式保存的文件小很多
# 反序列化(读取)
>>> integers = pickle.load(open("22901.dat", "rb"))
>>> print integers
[1, 2, 3, 4, 5]
>>> f = open("22903.dat", "rb")
>>> d = pickle.load(f)
>>> print d
{'i': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, .... #省略后面的数字}
>>> f.close()
# 自己定义数据类型
>>> import cPickle as pickle #cPickle更快
>>> import StringIO #标准库中的一个模块,跟file功能类似,只不过是在内存中操作“文件”
>>> class Book(object): #自定义一种类型
... def __init__(self,name):
... self.name = name
... def my_book(self):
... print "my book is: ", self.name
...
>>> pybook = Book("<from beginner to master>")
>>> pybook.my_book()
my book is: <from beginner to master>
>>> file = StringIO.StringIO()
>>> pickle.dump(pybook, file, 1)
>>> print file.getvalue() #查看“文件”内容,注意下面不是乱码
ccopy_reg
_reconstructor
q(c__main__
Book
qc__builtin__
object
qNtRq}qUnameqU<from beginner to master>sb.
>>> pickle.dump(pybook, file) #换一种方式,再看内容,可以比较一下
>>> print file.getvalue() #视觉上,两者就有很大差异
ccopy_reg
_reconstructor
q(c__main__
Book
qc__builtin__
object
qNtRq}qUnameqU<from beginner to master>sb.ccopy_reg
_reconstructor
p1
(c__main__
Book
p2
c__builtin__
object
p3
NtRp4
(dp5
S'name'
p6
S'<from beginner to master>'
p7
sb.
# 如果要从文件中读出来
>>> file.seek(0) #找到对应类型
>>> pybook2 = pickle.load(file)
>>> pybook2.my_book()
my book is: <from beginner to master>
>>> file.close()
json数据也是同理,两个方法。一个dump(),一个load()方法。