这是我的代码,

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

每当我运行这段代码,它给出以下错误:

UnicodeDecodeError: 'utf-8' codec无法解码字节0xe9在位置2892:无效的延续字节

我试图解决这个问题,并在open()中添加了一个额外的参数。代码如下:

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

但是它又给出了同样的错误。那我该怎么办呢?


当前回答

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

如果你的脚本运行在Linux操作系统上,你可以通过file命令获取编码:

file --mime-encoding <filename>

下面是一个python脚本来为你做这件事:

import sys
import subprocess

if len(sys.argv) < 2:
    print("Usage: {} <filename>".format(sys.argv[0]))
    sys.exit(1)

def find_encoding(fname):
    """Find the encoding of a file using file command
    """

    # find fullname of file command
    which_run = subprocess.run(['which', 'file'], stdout=subprocess.PIPE)
    if which_run.returncode != 0:
        print("Unable to find 'file' command ({})".format(which_run.returncode))
        return None

    file_cmd = which_run.stdout.decode().replace('\n', '')

    # run file command to get MIME encoding
    file_run = subprocess.run([file_cmd, '--mime-encoding', fname],
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
    if file_run.returncode != 0:
        print(file_run.stderr.decode(), file=sys.stderr)

    # return  encoding name only
    return file_run.stdout.decode().split()[1]

# test
print("Encoding of {}: {}".format(sys.argv[1], find_encoding(sys.argv[1])))

其他回答

您的文件实际上并不包含UTF-8编码的数据;它包含一些其他编码。弄清楚这种编码是什么,并在开放呼叫中使用它。

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

“utf-8”编解码器无法解码位置7044中的0xed字节:无效的延续字节

上述错误是由于编码造成的

解决方案:-使用" encoding='latin-1' "

参考:https://pandas.pydata.org/docs/search.html?q=encoding

下面的方法对我也有用。ISO 8859-1将节省很多,主要是如果使用语音识别api。

例子:

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

在我的情况下,这个问题发生,因为我修改了一个excel文件(.xlsx)的扩展名直接到(.csv)文件直接…

解决方案是打开文件,然后将其保存为新的(.csv)文件(即file -> save as ->选择(.csv)扩展名并保存它。这对我很管用。

用notepad++打开文件,选择“编码”或“编码”菜单来识别或从ANSI转换为UTF-8或ISO 8859-1代码页。