CSV、DictWriter、Unicode和UTF-8
我在使用DictWriter的时候遇到了关于非ASCII字符的问题。简单来说,我的问题是:
#!/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()
出现了这个错误信息:
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-8编码的内容。
1 个回答
9
你用 codecs.open
得到的对象在它的 write
方法里需要一个unicode 字符串——这就是它的主要目的。而 csv.DictWriter
实际上是用一个经过utf8编码的字节字符串来调用这个方法,所以才会出现异常。
把 f
的创建改成 f = open("test.csv", 'wb')
(把 codecs
去掉),这样就应该能正常工作了。