这是我的代码,

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

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


当前回答

我的问题类似于UTF-8文本被传递给Python脚本。

在我的例子中,它来自SQL Server机器学习服务中使用sp_execute_external_script的SQL。不管出于什么原因,VARCHAR数据似乎被作为UTF-8传递,而NVARCHAR数据被作为UTF-16传递。

由于无法在Python中指定默认编码,并且没有用户可编辑的Python语句解析数据,所以我不得不在@input_data参数中的SELECT查询中使用SQL CONVERT()函数。

当这个查询

EXEC sp_execute_external_script @language = N'Python', 
@script = N'
OutputDataSet = InputDataSet
', 
@input_data_1 = N'SELECT id, text FROM the_error;'
WITH RESULT SETS (([id] int, [text] nvarchar(max)));

给出错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 0: unexpected end of data

使用CONVERT(类型,数据)(CAST(数据AS类型)也可以)

EXEC sp_execute_external_script @language = N'Python', 
@script = N'
OutputDataSet = InputDataSet
', 
@input_data_1 = N'SELECT id, CONVERT(NVARCHAR(max), text) FROM the_error;'
WITH RESULT SETS (([id] INT, [text] NVARCHAR(max)));

返回

id  text
1   Ç

其他回答

使用这个,如果你直接从github或kaggle加载数据DF=pd.read_csv(文件,编码='ISO-8859-1')

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

import os
assert os.path.isfile(filepath)

我的问题类似于UTF-8文本被传递给Python脚本。

在我的例子中,它来自SQL Server机器学习服务中使用sp_execute_external_script的SQL。不管出于什么原因,VARCHAR数据似乎被作为UTF-8传递,而NVARCHAR数据被作为UTF-16传递。

由于无法在Python中指定默认编码,并且没有用户可编辑的Python语句解析数据,所以我不得不在@input_data参数中的SELECT查询中使用SQL CONVERT()函数。

当这个查询

EXEC sp_execute_external_script @language = N'Python', 
@script = N'
OutputDataSet = InputDataSet
', 
@input_data_1 = N'SELECT id, text FROM the_error;'
WITH RESULT SETS (([id] int, [text] nvarchar(max)));

给出错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 0: unexpected end of data

使用CONVERT(类型,数据)(CAST(数据AS类型)也可以)

EXEC sp_execute_external_script @language = N'Python', 
@script = N'
OutputDataSet = InputDataSet
', 
@input_data_1 = N'SELECT id, CONVERT(NVARCHAR(max), text) FROM the_error;'
WITH RESULT SETS (([id] INT, [text] NVARCHAR(max)));

返回

id  text
1   Ç

如果你使用的是python2,下面是解决方案:

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

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

'encoding'是此函数的无效关键字参数

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

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

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

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