【问题标题】:Encoding error when reading csv file containing pandas dataframe读取包含熊猫数据框的 csv 文件时出现编码错误
【发布时间】:2016-09-06 06:16:36
【问题描述】:

我使用df.to_csv() 将数据帧转换为 csv 文件。在 python 3 下,pandas doc 声明它默认为 utf-8 编码。

但是,当我在同一个文件上运行 pd.read_csv() 时,我得到了错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xae in position 8: invalid start byte

但是使用 pd.read_csv()encoding="ISO-8859-1" 可以。

这里的问题是什么?如何解决它,以便我可以编写和加载具有一致编码的文件?

【问题讨论】:

  • 你能给出一个重现这个问题的示例数据框吗?
  • @TadhgMcDonald-Jensen 无法,但我一直遇到使用来自同一来源的其他数据集创建的数据框的问题。

标签: python csv pandas encoding


【解决方案1】:

您尝试阅读的原始.csvencoded,例如ISO-8859-1。这就是为什么它是UnicodeDecodeError - python / pandas 正在尝试使用utf-8 编解码器decode 源,假设默认情况下源是unicode

一旦您指定了非默认源编码,pandas 将使用正确的编解码器来匹配源并解码为内部使用的格式。

请参阅 python docs 和更多 hereAlso very good.

【讨论】:

  • 我没有尝试使用ISO-8859-1 读取,因为在读取utf-8 中的原始文件时没有遇到错误。这是否意味着即使我能够加载原始文件并将其写入磁盘,也可能出现错误?
  • 你说得对,它应该是这样工作的。如果您的文件是 utf8 编码为 python 3 确实默认,您应该能够毫无问题地读取它。这通常会在打开另一个应用程序(如 excel)时中断。需要有关文件和进程的足够详细信息才能重现错误,抱歉,到目前为止只能解释错误消息。
  • 将参数encoding='utf-8'添加到df.to_csv()即可解决问题。
【解决方案2】:

这是一个使用未知(?)编码的 pandas 的具体示例,当没有明确使用 encoding 参数和 pandas.to_csv 时。

0x92 是 '(看起来像撇号)

import pandas
ERRORFILE = r'written_without_encoding_parameter.csv'
NO_ERRORFILE = r'written_WITH_encoding_parameter.csv'

df_dummy = pandas.DataFrame([u"Yo what's up", u"I like your sister’s friend"])

df_dummy.to_csv(ERRORFILE)
df_dummy.to_csv(NO_ERRORFILE, encoding="utf-8")

df_no_error_with_latin = pandas.read_csv(ERRORFILE, encoding="Latin-1")
df_no_error = pandas.read_csv(NO_ERRORFILE)
df_error = pandas.read_csv(ERRORFILE)
>>> UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in position 18: invalid start byte

所以看起来你必须明确地使用encoding="utf-8"to_csv,即使熊猫文档说它默认使用它。或者使用encoding="Latin-1"read_csv

更令人沮丧...

df_error_even_with_utf8 = pandas.read_csv(ERRORFILE, encoding="utf-8")
>>> UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in position 18: invalid start byte

我使用的是 Windows 7、Python 3.5、pandas 0.19.2。

【讨论】:

  • 遇到了同样的问题,将 excel df 转换为 csv。后来尝试读取 csv 并看到“utf-8”错误 - 无效的起始字节。使用 pd.read_csv() 和 encoding="ISO-8859-1" 有效,但不知道为什么。也许它是 Python 3.6 中的一个错误?
【解决方案3】:

请尝试使用 encoding='unicode_escape' 读取数据。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2015-05-30
    • 2014-06-28
    • 2020-10-06
    • 2014-01-14
    • 2018-03-11
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多