“ for line in…”导致UnicodeDecodeError:'utf-8'编解码器无法解码字节


214

这是我的代码,

for line in open('u.item'):
#read each line

每当我运行此代码时,都会出现以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte

我试图解决这个问题,并在open()中添加了一个额外的参数,代码看起来像;

for line in open('u.item', encoding='utf-8'):
#read each line

但是,它再次给出相同的错误。那我该怎么办!请帮忙。


3
我认为编码错误的数据。
Andreas Jung

9
还是不是UTF-8数据。
马克·托隆宁


使用python 3而非python 2.7时,msgpack出现此错误。对我们来说,行动的过程就是使用python 2.7。
杰西·科林斯

Answers:


402

正如Mark Ransom所建议的,我找到了解决该问题的正确编码。编码为“ ISO-8859-1”,因此替换open("u.item", encoding="utf-8")open('u.item', encoding = "ISO-8859-1")可以解决该问题。


8
显式优于隐式(PEP 20)。
Ioannis Filippidis '16

6
诀窍是ISO-8859-1或Latin_1是8位字符集,因此所有垃圾都具有有效值。也许没有用,但是如果您想忽略!
Kjeld Flarup

1
我遇到了同样的问题UnicodeDecodeError:'utf-8'编解码器无法解码位置32的字节0xd0:无效的连续字节。我使用python 3.6.5安装了aws cli。当我尝试aws --version时,它失败并显示此错误。因此,我不得不编辑/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py并将代码更改为以下def读取(自身,文件名,编码=“ ISO-8859-1” ):
ЕвгенийКоптюбенко18年

3
有自动检测编码的方法吗?
OrangeSherbet '19

5
@OrangeSherbet我使用实现了检测chardet。下面是一行代码(后import chardet): chardet.detect(open(in_file, 'rb').read())['encoding']。请查看此答案以获取详细信息:stackoverflow.com/a/3323810/615422
VertigoRay

51

同样对我有用,ISO 8859-1将节省很多,哈哈哈,主要是如果使用语音识别API的话

例:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

4
从错误消息中的0xe9(é)可以推断出OP正在读取ISO 8859-1,这可能是正确的,但是您应该解释为什么解决方案可以工作。对语音识别API的引用没有帮助。
RolfBly

5
分号是什么?
右腿

29

您的文件实际上并不包含utf-8编码的数据,而是包含其他一些编码。弄清楚编码是什么,并在open调用中使用它。

例如,在Windows-1252编码中,0xe9字符为é


4
所以,我怎么找出它是什么编码!我正在使用linux
SujitS

3
有没有办法做到这一点永远奏效,但看到这个问题的答案:stackoverflow.com/questions/436220/...
RemcoGerlich

20

尝试使用熊猫阅读

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')

不知道为什么要建议熊猫。解决方案是设置正确的编码,您在这里遇到过。
Alastair McCormack

12

如果使用Python 2以下将解决方案:

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

由于encodingparameter不适用于open(),因此您将收到以下错误:

TypeError:“ encoding”是此函数的无效关键字参数

1
但这是版本3
SujitS

1
是的,我知道。我认为这可能会对使用该工具的人有所帮助Python 2
Jeril

也为我在Python3中工作
-fenkerbb

2
如果您想要更容易记住的东西,'ISO-8859-1'也称为'latin-1''latin1'
Max Candocia



2

如果有人在寻找这些,这是在Python 3中转换CSV文件的示例:

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

有时,open(filepath)在其中filepath实际上不是一个文件会得到同样的错误,所以,首先要确保你试图打开的文件存在:

import os
assert os.path.isfile(filepath)

希望这会有所帮助。


1

您可以这样尝试:

open('u.item', encoding='utf8', errors='ignore')

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。- 评论
MartenCatcher
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.