UnicodeDecodeError:'utf-8'编解码器无法解码字节

Suj*_*itS 179 python character-encoding python-3.x

这是我的代码,

for line in open('u.item'):
#read each line
Run Code Online (Sandbox Code Playgroud)

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

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte
Run Code Online (Sandbox Code Playgroud)

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

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

但它再次给出了同样的错误.那我该怎么办!请帮忙.

Suj*_*itS 355

正如Mark Ransom所说,我找到了解决该问题的正确编码.编码是"ISO-8859-1",所以更换open("u.item", encoding="utf-8")open('u.item', encoding = "ISO-8859-1")将解决这个问题.

  • 显性优于隐性(PEP 20). (7认同)
  • 诀窍是ISO-8859-1或Latin_1是8位字符集,因此所有垃圾都有一个有效值.也许不可用,但如果你想忽略! (5认同)
  • @OrangeSherbet我使用`chardet`实现了检测。这是单行代码(在import chardet之后):chardet.detect(open(in_file,'rb')。read())['encoding']`。查看此答案以获取详细信息:/sf/answers/232666731/ (5认同)
  • 有自动检测编码的方法吗? (3认同)

Ryo*_*eto 44

也适合我,ISO 8859-1将节省很多,哈哈哈,主要是如果使用语音识别API

例:

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

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

Mar*_*som 29

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

例如,在Windows-1252编码中,0xe9将是字符é.

  • 那么,我怎样才能找出它的编码方式!我正在使用linux (4认同)
  • 没有办法做到总能奏效,但请看这个问题的答案:http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of -文本文件 (3认同)

Sha*_*ank 21

尝试使用pandas阅读

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')
Run Code Online (Sandbox Code Playgroud)

  • 不知道你为什么建议 Pandas。解决方案是设置正确的编码,您在这里偶然发现了这一点。 (2认同)
  • @PeterMortensen 是的,[维基百科证实了这一点](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)。当它们与 Python 中的“decode”一起使用时,也会产生相同的输出。 (2认同)

小智 16

这有效:

open('filename', encoding='latin-1')
Run Code Online (Sandbox Code Playgroud)

或者:

open('filename', encoding="ISO-8859-1")
Run Code Online (Sandbox Code Playgroud)


Jer*_*ril 11

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

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

因为encoding参数不起作用open(),您将收到以下错误:

TypeError: 'encoding' is an invalid keyword argument for this function

  • 但这是第 3 版 (2认同)
  • 是的,我知道。我认为这可能对使用“Python 2”的人有帮助 (2认同)
  • 如果您想要更容易记住的东西,则'ISO-8859-1'也被称为'latin-1'或'latin1'`。 (2认同)

Vin*_*ngh 9

我在阅读此数据集时使用从Kaggle下载的数据集,它引发了此错误:

UnicodeDecodeError:“utf-8”编解码器无法解码位置 183 中的字节 0xf1:无效的连续字节

这就是我修复它的方法。

import pandas as pd

pd.read_csv('top50.csv', encoding='ISO-8859-1')

Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用以下方法解决问题:

for line in open(your_file_path, 'rb'):
Run Code Online (Sandbox Code Playgroud)

'rb'以二进制模式读取文件。在这里阅读更多。希望这会有所帮助!


Far*_*dLU 6

你可以试试这个方法:

open('u.item', encoding='utf8', errors='ignore')
Run Code Online (Sandbox Code Playgroud)

  • 意图是什么?忽略错误?后果是什么? (2认同)

Ala*_*pin 6

基于Stackoverflow 上的另一个问题和本文之前的答案,我想添加一个帮助来找到正确的编码。

如果您的脚本在 Linux 操作系统上运行,您可以使用以下命令获取编码file

file --mime-encoding <filename>
Run Code Online (Sandbox Code Playgroud)

这是一个可以为您完成此操作的 python 脚本:

file --mime-encoding <filename>
Run Code Online (Sandbox Code Playgroud)


小智 5

这是在 Python 3 中转换 CSV 文件的示例:

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


归档时间:

查看次数:

418909 次

最近记录:

7 年 前