即使使用正确的编解码器也会出现编码错误

时间:2015-01-12 21:29:35

标签: python encoding

我想根据编码格式打开文件,因此我会执行以下操作:

import magic
import csv

i_file = open(filename).read()
mag = magic.Magic(mime_encoding=True)
encoding = mag.from_buffer(i_file)
print "The encoding is ",encoding

一旦我知道编码格式,我就会尝试使用正确的文件打开文件:

with codecs.open(filename, "rb", encoding) as f_obj:                         
    reader = csv.reader(f_obj)                                               
    for row in reader:                                                       
        csvlist.append(row)  

但是,我收到了下一个错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 0: ordinal not in range(128)

尝试打开编码为的csv文件:

The encoding is  utf-16le

有趣的部分来到这里。如果utf-16leutf-16替换,则会正确读取CSV utf-16le文件。但是,在ascii csv文件中使用它时读取效果不佳。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

Python 2' s csv module不支持Unicode。是否可以选择切换到Python 3?如果没有,你可以先将输入文件转换为UTF-8吗?

从上面链接的文档:

  

csv模块不直接支持读写Unicode,   但对于ASCII NUL的一些问题,它是8位清除保存(原文如此!)   字符。所以你可以编写处理函数的函数或类   只要你避免像编码一样编码和解码   使用NUL的UTF-16。建议使用UTF-8。

快速而肮脏的例子:

with codecs.open(filename, "rb", encoding) as f_obj:   
    with codecs.open(filename+"u8", "wb", "utf-8") as utf8:
        utf8.write(f_obj.read())
with codecs.open(filename+"u8", "rb", "utf-8") as f_obj:   
    reader = csv.reader(f_obj)
    # etc.

答案 1 :(得分:1)

这对您来说可能有点用处。 Checkout python 2文档 https://docs.python.org/2/library/csv.html

特别是本节:

  

对于所有其他编码,以下UnicodeReader和UnicodeWriter   可以使用类。他们需要额外的编码参数   他们的构造函数,并确保数据通过真正的读者   或编码为UTF-8的编写器:

查看页面底部!!!!