经常遇到在Python程序运行中得到了一些字符串、列表、字典等数据,想要保存下来,长长久久的,方便以后使用,这个时候Pickle模块就派上用场了。pickle 模块及其同类模块 cPickle 向 Python 提供了 pickle 支持,它可以将对象转换为一种可以传输或存储的格式(后者使用 C 编码,具有更好的性能)。
Pickle模块将任意一个Python对象转换成一系统字节的这个操作过程叫做串行化对象。
pickle 模块提供了以下函数对:dumps(object) 返回一个字符串,它包含一个 pickle 格式的对象;loads(string) 返回包含在 pickle 字符串中的对象。
import pickle
from pprint import pprint
a = [1,2,[3,4],'pyth','pickle']
pprint(a)
b = pickle.dump(a)
c = pickle.load(b)
pprint(b)
pprint(c)
因为我的服务器没有cPickle,所以使用pickle。pprint与print的差别是,对于很长很复杂的输出,pprint会根据数据结构分行输出,方便查看。上面代码的输出如下。
[1, 2, [3, 4], ‘pyth’, ‘pickle’]
(b’\x80\x03]q\x00(K…x06’b’\x00…pickleq\x03e.’)
[1, 2, [3, 4], ‘pyth’, ‘pickle’]
dump(object, file) 将对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象,这个对象具有 write() 方法,可以接受单个的字符串参数。缺省情况下, dumps() 和 dump() 使用可打印的 ASCII 表示来创建 pickle。
import pickle
s1 = 'pickle'
s2 = {'a':'one','b':'two','c':'three'}
s3 = ['faith','hope','love']
fil = open('demo.pkl', 'wb')
pickle.dump(s1, fil)
pickle.dump(s2, fil, True)
pickle.dump(s3, fil, 1)
fil.close()
load(file) 返回包含在 pickle 文件中的对象。loads() 和 load() 函数自动检测 pickle 是二进制格式还是文本格式。
fie = open('demo.pkl', 'rb')
t1 = pickle.load(fie)
t2 = pickle.load(fie)
t3 = pickle.load(fie)
pprint(t1)
pprint(t2)
pprint(t3)
t4 = pickle.load(fie)
输出为
‘pickle’
{‘a’: ‘one’, ‘b’: ‘two’, ‘c’: ‘three’}
[‘faith’, ‘hope’, ‘love’]
EOFError: Ran out of input
Python3不支持cPickle,因而在Python2中储存的pkl文件在Python3中打开时会出现错误,如
fil = open('test.pkl', 'rb')
dat = pickle.load(fil)
会出现解码错误;
UnicodeDecodeError: ‘ascii’ codec can’t decode byte … in position x: ordinal not in range(128)
此时需要用encode对文件中的字符串制定编码格式,则正常读取。
dat = pickle.load(fil, encoding = 'iso-8859-1')
参考资料
百度经验 python如何将数据转成.pkl文件
新浪博客 pickle及cPickle模块_努力向前
CSDN oo笨小孩oo python3使用pickle读取文件提示TypeError或者UnicodeDecodeError的解决办法,原文链接link.