我想根据编码格式打开文件,因此我会执行以下操作:
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-16le
被utf-16
替换,则会正确读取CSV utf-16le文件。但是,在ascii
csv文件中使用它时读取效果不佳。
我做错了什么?
答案 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的编写器:
查看页面底部!!!!