这里记录了 python 的编码异常。
参考资料
成功解决Python3版UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x90 in position 614: ordinal not in
小知识
Python 3默认是utf8编码格式
异常
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe8 in position
参考资料
python问题:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe8 in position
解决unicodedecodeerror ascii codec can’t decode byte 0xd7 in position 9 ordinal not in range
Python 的reload 方法
Python3中reload的使用方式
修改python默认的编码方式
python编码错误:UnicodeDecodeError: ‘utf8’ codec can’t decode
成功解决Python3版UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x90 in position 614: ordinal not in
背景
用的环境是 python3.5
因为要做脑电项目,方向是情感分类,所以下载了 DEAP 数据库,在 load 数据库的时候出现上面的异常。
x = cPickle.load(open('s01.dat','rb'))
关于这个库的使用,可以参照我下面的博文。
编码问题,大概是 ascii 不行,所以应该转为 utf-8
于是在 import 下面添加如下的代码
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
出现了一个问题,就是没有找到 reload
所以,在开头加入
import sys
from imp import reload
发现并没有什么卵用,还是编码错误,于是尝试改变编码 gbk
if sys.getdefaultencoding() != 'gbk':
reload(sys)
sys.setdefaultencoding('gbk')
结果出现 name reload’ is not defined
经过查阅资料得知
在3.x中已经被毙掉了被替换为
import importlib
importlib.reload(sys)
但是,也没有用这个代码,因为我尝试输出了一下原始编码
print(sys.getdefaultencoding())
发现默认编码就是 utf-8
经过,一段时间的排查,将
x = cPickle.load(open('s01.dat','rb'))
变为
x = cPickle.load(open('s01.dat','rb'),encoding='bytes')
问题解决。也就是在 python3 的环境中不需要修改编码。
后续
sys.setdefaultencoding 方法在python导入 site.py 后就删除了, 不能再被调用了. 在确定sys已经导入的情况下, 可以reload sys这个模块, 之后, 再 sys.setdefaultencoding(‘utf8’)
当然,这个 setdefaultencoding 在python3.x 已经转变为其他书写方式了。
但是,还有更好的方法
如何永久地将默认编码设置为utf-8呢? 有2种方法:
第一个方法<不推荐>:
编辑你的文件,按照上面的书写方式修改编码, 也就是setencoding()函数, 强制设置为 utf-8
第二个方法<推荐>:
增加一个名为 sitecustomize.py, 推荐存放的路径为 site-packages 目录下
sitecustomize.py 是在 site.py 被import 执行的, 因为 sys.setdefaultencoding() 是在 site.py 的结尾处被删除的, 所以, 可以在 sitecustomize.py 使用 sys.setdefaultencoding().
#file name: sitecustomize.py
import sys
sys.setdefaultencoding('utf-8')
既然 sitecustomize.py 能被自动加载, 所以除了设置编码外, 也可以设置一些其他的东西.
第二种方法没有试过,但是如果要用,我还是选择第一种方法,但考虑到代码复用,也许第二种方法更好。