Python3 CSV读取器Unicode解码错误

时间:2016-02-12 08:53:34

标签: python csv unicode encoding

我在utf8编码中有一个巨大的csv文件,但是一些编码与主文件编码不同的列。它看起来像:

UTF-8编码中的

input.txt

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

win-1252中的 input.txt

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)

和标准的python3 csv阅读器在这些行上产生编码错误。我不能忽略读取这一行,但我只需要总是好的编码" someOther"列。

使用标准的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

1 个答案:

答案 0 :(得分:4)

您对文件的UTF8编码有多确定?

对于您发布的小样本,enum { value_one = 0, value_two = 1, value_three = 3, value_max } for ( i = value_one; i < value_max; i++ ) { switch(i) { case value_one: case value_two: case value_three: case value_four: { /* ... Do something with valid enum value ... */ } break; default: /* Found an invalid enum entry; ignore it */ break; } } 上的ü失败了UTF8解码失败,这是&#34; LATIN SMALL LETTER U WITH DIAERESIS&#34;。当编码为ISO-8859-1时,ü'\xfc'。另外两种可能性是CSV文件是UTF-16编码的(UTF-16小端在Windows上很常见),甚至是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