"utf-8"编解码器无法解码第18个位置的0x92字节:起始字节无效。

58
我正在尝试读取名为df1的数据集,但它无法工作。
import pandas as pd
df1=pd.read_csv("https://raw.githubusercontent.com/tuyenhavan/Statistics/Dataset/World_Life_Expectancy.csv",sep=";")

df1.head()

这段代码存在很多错误,但这是最相关的部分。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in position 18: invalid start byte

1
数据仅包含单个0x92字节。您尝试过指定不同的编码吗? - Martijn Pieters
我尝试了几次,但是没有成功。 - Tuyen
当然,你尝试了哪些编解码器? - Martijn Pieters
5个回答

103

这些数据确实没有使用UTF-8编码;除了一个0x92字节,其他都是ASCII编码:

b'Korea, Dem. People\x92s Rep.'

请将它解码为Windows 1252编码,其中0x92是一个华丽引号

df1 = pd.read_csv("https://raw.githubusercontent.com/tuyenhavan/Statistics/Dataset/World_Life_Expectancy.csv",
                  sep=";", encoding='cp1252')

示例:

>>> import pandas as pd
>>> df1 = pd.read_csv("https://raw.githubusercontent.com/tuyenhavan/Statistics/Dataset/World_Life_Expectancy.csv",
...                   sep=";", encoding='cp1252')
>>> df1.head()
                   2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  \
0     Afghanistan  55.1  55.5  55.9  56.2  56.6  57.0  57.4  57.8  58.2  58.6
1         Albania  74.3  74.7  75.2  75.5  75.8  76.1  76.3  76.5  76.7  76.8
2         Algeria  70.2  70.6  71.0  71.4  71.8  72.2  72.6  72.9  73.2  73.5
3  American Samoa    ..    ..    ..    ..    ..    ..    ..    ..    ..    ..
4         Andorra    ..    ..    ..    ..    ..    ..    ..    ..    ..    ..

   2010  2011  2012  2013  Unnamed: 15  2014  2015
0  59.0  59.3  59.7  60.0          NaN  60.4  60.7
1  77.0  77.2  77.4  77.6          NaN  77.8  78.0
2  73.8  74.1  74.3  74.6          NaN  74.8  75.0
3    ..    ..    ..    ..          NaN    ..    ..
4    ..    ..    ..    ..          NaN    ..    ..

我注意到,Pandas似乎也是按照HTTP标题的面值来处理数据,并且在从URL加载数据时会产生乱码。当我将数据直接保存到磁盘,然后使用pd.read_csv()进行加载时,数据会被正确解码,但是从URL加载则会产生重新编码的数据:

>>> df1[' '][102]
'Korea, Dem. People’s Rep.'
>>> df1[' '][102].encode('cp1252').decode('utf8')
'Korea, Dem. People’s Rep.'

这是Pandas中的已知Bug。你可以通过使用urllib.request加载URL并将其传递给pd.read_csv() 来解决此问题:

>>> import urllib.request
>>> with urllib.request.urlopen("https://raw.githubusercontent.com/tuyenhavan/Statistics/Dataset/World_Life_Expectancy.csv") as resp:
...     df1 = pd.read_csv(resp, sep=";", encoding='cp1252')
...
>>> df1[' '][102]
'Korea, Dem. People’s Rep.'

5
你好Martijin,你是如何知道它的编码是cp1252的? - Tuyen
6
@Tuyen: 经验。 - Martijn Pieters
你也可以写成 encoding='latin1'。对我来说没问题。 - RajeshM
@RajeshM 这可能是因为 Latin1“适用于”任何文件。但这并不意味着解码后的文本可读且没有问题。Windows-1252和Latin-1密切相关但并不相同。如果你的结果中出现奇怪的字符,那么你选择了错误的编解码器。 - Martijn Pieters
@DISC-O:“基于美国的Excel 2010”并没有告诉我任何具体信息,不幸的是;默认值显然应该是1252。“西欧”是Microsoft用于该编解码器的一个名称;历史上还使用了误称“ANSI Latin 1”。我不确定提到它会为答案增加什么内容? - Martijn Pieters
显示剩余2条评论

7

原来在Mac OS上创建的CSV文件在Windows机器上解析时出现了UnicodeDecodeError错误。 为了解决这个问题,可以尝试在pandas库的read_csv方法中传递参数encoding='mac-roman'。

import pandas as pd
df1=pd.read_csv("https://raw.githubusercontent.com/tuyenhavan/Statistics/Dataset/World_Life_Expectancy.csv",sep=";", encoding='mac_roman')
df1.head()

输出:

    2000    2001    2002    2003    2004    2005    2006    2007    2008    2009    2010    2011    2012    2013    Unnamed: 15 2014    2015
0   Afghanistan 55.1    55.5    55.9    56.2    56.6    57.0    57.4    57.8    58.2    58.6    59.0    59.3    59.7    60.0    NaN 60.4    60.7
1   Albania 74.3    74.7    75.2    75.5    75.8    76.1    76.3    76.5    76.7    76.8    77.0    77.2    77.4    77.6    NaN 77.8    78.0
2   Algeria 70.2    70.6    71.0    71.4    71.8    72.2    72.6    72.9    73.2    73.5    73.8    74.1    74.3    74.6    NaN 74.8    75.0
3   American Samoa  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  NaN ..  ..
4   Andorra ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  NaN ..  ..

与Latin-1 / ISO-8859-1类似,Mac OS Roman字符集将所有256个可能的字节值映射到一个单一字符,因此永远不会导致解码错误,并且可以在任何文件上工作。但这并不意味着您使用了正确的编解码器,您仍然可能会因此在数据集中得到奇怪的字符。 - Martijn Pieters
我做了这个,它改变了单词的格式。例如,"Can't" 被转换为 "can't"。但是 encoding='cp1252' 对我有用。 - user3665906

3

更好了。考虑总结一下为什么这有所帮助,可能是如何工作的。还要检查一下您的帖子是否提供了任何新的内容,例如与Martin Piejters在https://dev59.com/GVcO5IYBdhLWcg3wVAA0#54886413上的评论相比较。或者考虑引用该评论以示感谢。 - Yunnosch

0
这个问题是由于文件中出现了一些未知字符所导致的。 例如,在使用 utf-8 编码的文件中,出现了一些 windows 1250 字符。 你应该删除或替换这些字符以解决问题。

-3

这个有效

df = pd.read_csv(inputfile, engine = 'python')


请阅读"[answer]"和"完全基于代码的答案解释"。如果您能提供为什么这是首选解决方案以及解释其工作原理的说明,那将更有帮助。我们想要教育,而不仅仅是提供代码。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接