pickle与.pkl文件

经常遇到在Python程序运行中得到了一些字符串、列表、字典等数据,想要保存下来,长长久久的,方便以后使用,这个时候Pickle模块就派上用场了。pickle 模块及其同类模块 cPickle 向 Python 提供了 pickle 支持,它可以将对象转换为一种可以传输或存储的格式(后者使用 C 编码,具有更好的性能)。

pickle对python对象的转换

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’]

  • 中间太长了就省略了。

将数据结构保存到.pkl文件

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()
  • final 参数(可选)如果为 True ,则该参数指定用更快以及更小的二进制表示来创建 pickle;
  • 3种索引,0为ASCII,1是旧式2进制,2是新式2进制协议,不同之处在于后者更高效一些。

读取.pkl文件数据

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

Python2与Python3的兼容问题

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.

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值