admin管理员组

文章数量:1611961

问题引入

UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence

这样的错误估计大家都不陌生。我也是被这种错误折磨许久。在open函数参数中设置encoding='utf-8’也不能解决问题,会出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte类似错误。
通过查询大量的资料,我才搞明白这种错误背后的原因是什么。

该问题的根源在于Windows中与Unicode的编码方法。

以系统自带的记事本为例:
记事本“另存为”中有4种编码方式,含义为:

ANSI: 对英文系统即ASCII 对中文系统即gbk/big5
Unicode: UTF-16(LE)
Unicode big endian: UTF-16(BE)
UTF-8:UTF-8-SIG

其中Unicode相关编码方式有3种,这3种编码方式的区别不再赘述,我们可以从文件的头部(即Windows中的特色!BOM:byte order mark)来区分一个文件是属于哪种编码。
当头部开始的两个字节为 FF FE时,是UTF-16(LE)编码;当头部的两个字节为FEFF时,是UTF-16(BE)编码;当头部两个字节为EF BB时,是UTF-8-sig编码。

实际问题

我遇到这样的问题是在《机器学习实战》朴素贝叶斯中,当时是对垃圾邮件分类,有50个文件,读取文件后报错。

word_list=text_parse(open('native_bayes  email dataset/ham/%d.txt'%i,'r').read()) # 读取每个非垃圾邮件,并字符串转换成字符串列表

用gbk编码的无法用utf-8解码,继续改回去,在for循环中 加print(i),查看哪个txt文件出问题:


```python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Traceback (most recent call last):
  File , line 1, in <module>
    bayes.spamTest()
  File "F:/PycharmProject/bayes_practice_1.py", line 96, in spamTest
    word_list = text_parse(open('native_bayes  email dataset/ham/%d.txt'%i,'r'' % i).read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 199: illegal multibyte sequence

查出问题在 文档《23.Txt》中,“SciFinance?is ”改成“SciFinance is ”即可,原文如下:

SciFinance?is a derivatives pricing and risk model development tool that automatically generates C/C++ and GPU-enabled source code from concise, high-level model specifications. No parallel computing or CUDA programming expertise is required.

更改后问题便可解决!

本文标签: 实战机器gbkCodecDecode