【问题标题】:'utf-8' codec can't decode byte 0x92 in position 18: invalid start byte“utf-8”编解码器无法解码位置 18 中的字节 0x92:无效的起始字节
【发布时间】:2018-02-10 12:23:02
【问题描述】:

我正在尝试读取名为 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

【问题讨论】:

  • 数据仅包含单个 0x92 字节。您是否尝试过指定不同的编码?
  • 试了几次,还是不行
  • 当然可以,但是您尝试了哪些编解码器?

标签: python-3.x data-import


【解决方案1】:

数据确实没有编码为UTF-8;除了那个 0x92 字节之外,一切都是 ASCII:

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

将其解码为 Windows codepage 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 加载数据时生成 Mojibake。当我将数据直接保存到磁盘时,然后pd.read_csv()加载它,数据被正确解码,但从URL加载会产生重新编码的数据:

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

这是known bug in Pandas。您可以通过使用 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.'

【讨论】:

  • 嗨Martijin 你怎么知道它的编码是cp1252?
  • @Tuyen:经验。
  • 非常感谢@Martijn
  • @Tuyen:提醒:Pandas 中有一个错误会影响从 URL 加载非 UTF8 数据。我提供了一个解决方法。
  • 太棒了。非常感谢@Martijn Pieters
【解决方案2】:

原来在 mac os 中创建的 csv 在 windows 机器上被解析,我得到了 UnicodeDecodeError。 要消除此错误,请尝试将参数 encoding='mac-roman' 传递给 pandas 库的 read_csv 方法。

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 ..  ..

【讨论】:

    【解决方案3】:

    由于您的文件中有一些未知字符,会出现此问题。 例如,在您使用 utf-8 编码的文件中,windows 1250 中有一些字符。 您应该删除或替换此字符以解决您的问题

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多