问题描述
我遇到了DictWriter和非ascii字符的问题。我的问题的简短版本:
I am having problems with the DictWriter and non-ascii characters. A short version of my problem:
#!/usr/bin/env python # -*- coding: utf-8 -*- import codecs import csv f = codecs.open("test.csv", 'w', 'utf-8') writer = csv.DictWriter(f, ['field1'], delimiter='\t') writer.writerow({'field1':u'å'.encode('utf-8')}) f.close()
>
Gives this Traceback:
Traceback (most recent call last): File "test.py", line 10, in <module>writer.writerow({'field1':u'å'.encode('utf-8')}) File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/csv.py", line 124, in writerow return self.writer.writerow(self._dict_to_list(rowdict)) File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", line 638, in write return self.writer.write(data) File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", line 303, in write data, consumed = self.encode(object, self.errors) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
我有点失落,因为DictWriter应该能够使用UTF-
I am bit lost as the DictWriter ought to be able to work with UTF-8 from what I have read in the documentation.
推荐答案
使用 codecs.open获得的对象在 write 方法中需要 unicode 字符串 - 这就是要点。 csv.DictWriter 当然是使用utf8编码的字节字符串调用该方法,而不是异常。
The object you obtain with codecs.open wants a unicode string in its write method -- that's the whole point. csv.DictWriter of course is calling that method with a utf8-encoded byte string instead, whence the exception.
将 f 的创建更改为 f = open(test.csv,'wb') c $ c> codecs 出来的图片)和东西应该工作很好。
Change f's creation to f = open("test.csv", 'wb') (taking codecs out of the picture) and things should work just fine.
这篇关于CSV,DictWriter,unicode和utf-8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!