2016-02-12 86 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