python3使用pickle读取文件提示TypeError或者UnicodeDecodeError的解决办法

转自 http://blog.csdn.net/programmer_wei/article/details/50994318

python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

python2使用的是cPickle模块,而在python3中cPickle已经被取消,取而代之的是pickle模块。

开发过程中,我曾经遇到一个奇怪的问题,在读取一个文件时候,使用python2的如下方式:

import cPickle
train, test, dicts = cPickle.load(open(“./dataset/atis.pkl”))

是可以正常读取文件的。
可是当换做python3的方式读取文件时候,如下:

import pickle
train, test, dicts = pickle.load(open(“./dataset/atis.pkl”))

却获得了错误提示,提示信息如下:

Traceback (most recent call last):
File “Main.py”, line 4, in
train, test, dicts = pickle.load(open(“./dataset/atis.pkl”))
TypeError: ‘str’ does not support the buffer interface

查询错误信息后得知解决办法 链接,应该指明用二进制方式打开文件,于是代码改为:

import pickle
train, test, dicts = pickle.load(open(“./dataset/atis.pkl”, “rb”))

可是这时候错误变成了:

Traceback (most recent call last):
File “Main.py”, line 4, in
train, test, dicts = pickle.load(open(“./dataset/atis.pkl”, “rb”))
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe8 in position 0: ordinal not in range(128)

于是再次求助万能的google,终于找到了解决办法 链接,我们需要告诉pickle:how to convert Python bytestring data to Python 3 strings,The default is to try and decode all string data as ASCII,所以代码改为:

import pickle
train, test, dicts = pickle.load(open(“./dataset/atis.pkl”, “rb”), encoding=’iso-8859-1’)
问题终于的到了解决。

ISO8859-1,通常叫做 Latin-1。Latin-1 包括了书写所有西方欧洲语言不可缺少的附加字符。iso8859-1 和 ascii 编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。
而 gb2312 是标准中文字符集。
UTF-8 是 UNICODE 的一种变长字符编码,即 RFC 3629。简单的说——大字符集。可以解决多种语言文本显示问题,从而实现应用国际化和本地化。

https://zhidao.baidu.com/question/26613602.html
https://www.cnblogs.com/doudou-taste/p/7351278.html

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值