【问题标题】:Python pandas load csv ANSI Format as UTF-8Python pandas 将 csv ANSI 格式加载为 UTF-8
【发布时间】:2017-05-04 15:16:36
【问题描述】:

我想在 Jupyter Notebooks 中加载带有 pandas 的 CSV 文件,其中包含 ä、ö、ü、ß 等字符。

当我使用 Notepad++ 打开 csv 文件时,这里有一个示例行,它会导致 ANSI 格式出现问题:

Empf„nger;Empf„ngerStadt;Empf„ngerStraáe;Empf„ngerHausnr.;Empf„ngerPLZ;Empf„ngerLand

Empf„nger 的正确 UTF-8 结果应该是:Empfänger

现在,当我使用以下代码在 Windows 上的 Python 3.6 pandas 中加载 CSV 数据时:

df_a = pd.read_csv('file.csv',sep=';',encoding='utf-8')

我收到错误消息:

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

位置'xy'是导致错误消息的字符出现的位置

当我使用 ansi 格式加载我的 csv 文件时,它可以工作,但显示的元音不正确。

示例代码:

df_a = pd.read_csv('afile.csv',sep=';',encoding='ANSI')

Empfänger 表示为:Empf„nger

注意:我曾尝试在 Notepad++ 中将文件转换为 UTF-8,然后使用 pandas 模块加载它,但我仍然遇到同样的错误。

我在网上搜索了一个解决方案,但提供的解决方案,例如“将 notepad++ 中的格式更改为 utf-8”或“使用 encoding='UTF-8'”或“latin1”,这给了我与 ANSI 格式相同的结果或

import chardet

with open('afile.csv', 'rb') as f:
    result = chardet.detect(f.readline())

df_a = pd.read_csv('afile.csv',sep=';',encoding=result['encoding'])

对我没用。

encoding='cp1252'

抛出以下异常:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2: character maps to <undefined>

之后我也尝试用 x.replace() 方法替换字符串,但字符 ü 在加载到 pandas DataFrame 后完全消失

【问题讨论】:

  • 你试过encoding='latin1'吗?
  • 是的,Empf„nger 变成:Empfnger 在显示的单元格中,我将编辑我也尝试过 latin1 的原始问题。

标签: python csv pandas decode


【解决方案1】:

如果您不知道您的文件编码是什么,我认为最快的方法是在文本编辑器上打开文件,例如 Notepad++ 以检查您的文件是如何编码的。

然后您转到python documentation 并查找要使用的正确编解码器。

在你的情况下,ANSI,编解码器是'mbcs',所以你的代码看起来像这些

df_a = pd.read_csv('file.csv',sep=';',encoding='mbcs')

【讨论】:

    【解决方案2】:

    EmpfängerStraße 在解码为“ANSI”时显示为 Empf„ngerStraáe,或者在这种情况下更准确地说是 cp1250,那么数据的实际编码很可能是cp850:

    print 'Empf„ngerStraáe'.decode('utf8').encode('cp1250').decode('cp850')
    

    或 Python 3,其中文字字符串已经是 unicode 字符串:

    print("Empf„ngerStraáe".encode("cp1250").decode("cp850"))
    

    【讨论】:

    • 哇!使用 encoding='cp850' 加载文件有效,非常感谢!我无法验证您的 print ('Empf„ngerStraáe'.decode('utf8').encode('cp1250').decode('cp850')) 示例,它说:AttributeError: 'str' object has no attribute 'decode'. 在执行此操作之前是否导入了一些特殊库?
    • @MBUser 我使用print 作为语句,所以这是Python 2,其中str decode() 方法。
    【解决方案3】:

    在尝试了从 ISO-8859-1 到 8859-15、从 UTF-8 到 UTF-32、从 Windows-1250-1258 的所有众所周知的编码后,我找不到合适的解决方案,但没有任何工作正常。所以我的猜测是文本编码在导出过程中被破坏了。我自己的解决方案是使用 Windows-1251 将文本文件加载到 Dataframe 中,因为它不会删除我的文本文件中的特殊字符,然后用相应的字符替换所有损坏的字符。这是一个相当令人不满意的解决方案,需要花费大量时间来计算,但总比没有好。

    【讨论】:

    • 一个小补充:我尝试使用十六进制编辑器读取 BOM(字节对象标记),但文件没有。
    • Windows-1250 为我工作(我在使用 ISO 8859-1 时遇到了破折号问题)。但 Windows-1252 也有效,并且将从现在开始采用它:-)
    【解决方案4】:

    你可以使用编码值UTF-16LE来解决问题

    pd.read_csv("./file.csv", encoding="UTF-16LE")
    

    file.csv 应使用 NotePad++ 的编码 UTF-16LE 保存,选项 UCS-2 LE BOM

    最好的,

    【讨论】:

      【解决方案5】:

      cp1252 可在 linux 和 windows 上解码 latin1 编码的文件。

      df = pd.read_csv('data.csv',sep=';',encoding='cp1252')
      

      不过,如果您在 Windows 机器上运行,我建议您使用

      df = pd.read_csv('data.csv', sep=';', encoding='mbcs')
      

      具有讽刺意味的是,在编码中使用“latin1”并不总是有效。特别是如果您想将文件转换为不同的编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-10
        • 2017-08-29
        • 2018-01-17
        • 2018-06-21
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 2017-07-21
        相关资源
        最近更新 更多