301

这是我的代码,

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

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

UnicodeDecodeError:“utf-8”编解码器无法解码位置 2892 中的字节 0xe9:无效的继续字节

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

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

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

4

15 回答 15

552

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

于 2013-10-31T12:35:45.300 回答
70

以下也对我有用。ISO 8859-1将节省很多,主要是在使用语音识别 API 时。

例子:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1")
于 2017-10-26T19:49:14.133 回答
37

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

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

于 2013-10-31T05:58:23.990 回答
25

尝试使用Pandas阅读:

pd.read_csv('u.item', sep='|', names=m_cols, encoding='latin-1')
于 2017-01-31T20:35:31.667 回答
17

这有效:

open('filename', encoding='latin-1')

或者:

open('filename', encoding="ISO-8859-1")
于 2020-02-17T19:45:41.430 回答
15

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

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

由于该encoding参数不适用于open(),您将收到以下错误:

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

于 2017-03-03T17:32:48.770 回答
13

您可以通过以下方式解决问题:

for line in open(your_file_path, 'rb'):

'rb' 正在以二进制模式读取文件。在这里阅读更多。

于 2019-05-02T02:15:15.577 回答
6

你可以这样试试:

open('u.item', encoding='utf8', errors='ignore')
于 2020-05-23T19:53:03.110 回答
5

基于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])))
于 2021-08-30T05:19:54.953 回答
2

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

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass
于 2016-09-14T19:24:43.000 回答
2

有时使用open(filepath)in whichfilepath实际上不是文件时会出现相同的错误,因此首先确保您尝试打开的文件存在:

import os
assert os.path.isfile(filepath)
于 2018-08-29T03:58:51.383 回答
2

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

于 2021-01-22T09:46:39.120 回答
2

我在阅读这个数据集时使用了从Kaggle下载的数据集,它抛出了这个错误:

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

所以这就是我修复它的方法。

import pandas as pd

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

于 2021-10-13T12:46:05.293 回答
1

为了在类似问题(关于 UTF-8 错误)上更快地搜索网页以查找google-request,我将解决方案留给其他人。

我在使用该描述打开 .csv 文件时遇到问题:

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

我用记事本打开文件并计算第 150 个位置:那是一个西里尔符号。我使用编码为“UTF-8”的“另存为..”命令重新保存了该文件,并且我的程序开始工作。

于 2021-08-03T05:39:11.463 回答
0

编码替换为encoding='ISO-8859-1'

对于打开的行('u.item',编码='ISO-8859-1'):

打印(行)

于 2021-12-07T06:40:35.417 回答