Python熊猫载入csv ANSI格式为UTF-8

问题描述:

我想载入一个带熊猫的CSV文件在Jupyter笔记本中,其中包含像ä,ö,ü,ß这样的字符。Python熊猫载入csv ANSI格式为UTF-8

当我使用记事本打开CSV文件++这里有一个例子一行导致在ANSI格式的麻烦:

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

正确的UTF-8的结果为EMPF“手指应该是:Empfänger

现在当我加载CSV数据在Windows上的Python 3.6大熊猫用下面的代码:

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文件它的工作原理,但显示不正确umlaute的位置。

示例代码:

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

Empfänger被表示为:EMPF“手指

注:我试图将文件转换为UTF-8在记事本++和与熊猫模块之后加载它,但我仍然得到相同的错误。

我在网上搜索了一个解决方案,但提供的解决方案,如“改变格式在记事本++到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()方法,但性格ü完全消失装入大熊猫数据帧

+0

有你尝试过'encoding ='latin1''? –

+0

是的,Empf“nger变成:Empfnger在显示的单元格中,我将编辑我最初的问题,我也尝试过latin1。 – MBUser

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

+0

一个小的补充:我尝试用十六进制编辑器读取BOM(字节对象标记),但文件没有。 – MBUser

EmpfängerStraße显示为EMPF ANSI“ngerStraáe当作为解码‘’,或者更正确地在这种情况下CP1250,那么数据的实际编码是最有可能CP850:

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

哇!加载与编码='cp850'的文件工作,非常感谢!我不能验证你的例子 'print('empf“ngerStraáe'.decode('utf8')。encode('cp1250')。decode('cp850'))'它说:'AttributeError:'str'object没有属性'decode'.' 你在做之前是否导入了一些特殊的库? – MBUser

+0

@MBUser我使用'print'作为语句,所以这是Python 2,其中'str' _has_是一个'decode()'方法。 – BlackJack