2016-02-12 116 views
1

我有一個巨大的utf8編碼csv文件,但一些編碼與主文件編碼不同的列。它看起來像:Python3 CSV閱讀器Unicode解碼錯誤

input.txt中在UTF-8編碼:

a,b,c 
d,"e?",f 
g,h,"kü" 

相同input.txt中在Win-1252

a,b,c 
d,"eü",f 
g,h,"kü 

代碼:

import csv 

file = open("input.txt",encoding="...") 
c = csv.reader(file, delimiter=';', quotechar='"') 

for itm in c: 
    print(itm) 

和standart python3 csv閱讀器屬tes在這樣的行上編碼錯誤。我不能忽略閱讀這一行,但我只需要總是好的編碼「someOther」列。

是否可以使用standart csv閱讀器在某些「字節模式」下以某種方式拆分CSV數據,然後將每個數組元素轉換爲普通的python unicode字符串,還是應該實現自己的csv閱讀器?

回溯:

Traceback (most recent call last): 
    File "C:\Development\t.py", line 7, in <module> 
    for itm in c: 
    File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\lib\codecs.py", line 321, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 11: invalid start byte 
+0

我認爲'encoding =「...」'會導致問題。 –

+0

它的僞代碼,我只想提到utf-8或ascii或某些特殊編碼都不起作用。 – Oleg

+0

錯誤究竟是什麼?你可以發佈回溯?是CSV閱讀器中的錯誤,還是當您嘗試打印該行時? – mhawke

回答

4

如何確定是你,你的文件utf-8編碼?

對於您發佈的小樣本,UTF8解碼在ü即「LATIN小寫字母U WITH DIAERESIS」上失敗。當編碼爲ISO-8859-1時,ü'\xfc'。另外兩種可能性是CSV文件是UTF-16編碼(在Windows上常見的是UTF-16小端序),甚至是Windows-1252。

如果您的CSV文件使用ISO-8859-X系列編碼之一進行編碼, ISO 8859-1/3/4/9/10/14/15/16中的任何一個將ü編碼爲0xfc。

要解決,使用正確的編碼,打開這樣的文件:

file = open("input.txt", encoding="iso-8859-1") 

或者,對於Windows 1252:

file = open("input.txt", encoding="windows-1252") 

,或者對於UTF-16:

file = open("input.txt", encoding="utf-16") # or utf-16-le or utf-16-be as required 
+0

你是對的,我可以使用一些編碼如iso,然後分別確定每列的編碼。 – Oleg

+0

@OlegGolovanov:我的觀點是整個文件將被編碼爲建議的編碼之一。多個編碼不太可能出現在同一個文件中。這也是可能的(我已經更新了我的答案)該文件是UTF-16編碼的。 – mhawke

+0

「在一個建議的編碼。」這不是不可能的 - 這是我的情況。該文件大約爲1.5GB,所有字段都以UTF-8編碼,但某些列是從Web報廢的url,它們是「按原樣」編寫的 - 這會導致問題。我無法重新生成此文件 - 這是我的輸入。 – Oleg