Python pandas 将 csv ANSI 格式加载为 UTF-8

MBU*_*ser 8 python csv decode pandas

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

当我用 Notepad++ 打开 csv 文件时,这是一个导致 ANSI 格式问题的示例行:

Empf„nger;Empf„ngerStadt;Empf„ngerStraáe;Empf„ngerHausnr.;Empf„ngerPLZ;Empf„ngerLand
Run Code Online (Sandbox Code Playgroud)

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

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

df_a = pd.read_csv('file.csv',sep=';',encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position xy: invalid continuation byte
Run Code Online (Sandbox Code Playgroud)

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

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

示例代码:

df_a = pd.read_csv('afile.csv',sep=';',encoding='ANSI')
Run Code Online (Sandbox Code Playgroud)

Empfänger 表示为:Empf?nger

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

我在网上搜索了一个解决方案,但提供的解决方案,例如“将记事本++中的格式更改为 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'])
Run Code Online (Sandbox Code Playgroud)

没有为我工作。

encoding='cp1252'
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

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

小智 8

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

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

在您的情况下,ANSI,编解码器是“mbcs”,所以您的代码将如下所示

df_a = pd.read_csv('file.csv',sep=';',encoding='mbcs')
Run Code Online (Sandbox Code Playgroud)


Bla*_*ack 5

Empf\xc3\xa4ngerStra\xc3\x9fe显示为Empf\xe2\x80\x9engerStra\xc3\xa1e时 xe2\x80\x9engerStra\xc3\xa1e 时,或者在这种情况下更正确地为 cp1250,则数据的实际编码很可能是 cp850:

\n
print 'Empf\xe2\x80\x9engerStra\xc3\xa1e'.decode('utf8').encode('cp1250').decode('cp850')\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
print("Empf\xe2\x80\x9engerStra\xc3\xa1e".encode("cp1250").decode("cp850"))\n
Run Code Online (Sandbox Code Playgroud)\n

  • 哇!使用encoding='cp850'加载文件成功了,非常感谢!我无法验证您的“print ('Empf„ngerStraáe'.decode('utf8').encode('cp1250').decode('cp850'))”示例,它说:“AttributeError: 'str' object has no属性“解码”。`在执行此操作之前是否导入了一些特殊的库? (4认同)

MBU*_*ser 1

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