2017-05-04 61 views
0

我想載入一個帶熊貓的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

回答

0

我無法找到一個後在嘗試了從ISO-8859-1到8859-15,從UTF-8到UTF-32,從Windows-1250-1258的所有衆所周知的編碼並且沒有任何工作正確後,找到合適的解決方案。所以我的猜測是文本編碼在導出過程中被破壞了。我自己的解決方案是使用Windows-1251在Dataframe中加載文本文件,因爲它不會在我的文本文件中刪除特殊字符,然後用相應的替換所有破碎的字符。它是一個相當不滿意的解決方案,需要花費大量的時間進行計算,但總比沒有好。

+0

一個小的補充:我嘗試用十六進制編輯器讀取BOM(字節對象標記),但文件沒有。 – MBUser

0

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