CSV、DictWriter、Unicode和UTF-8

5 投票
1 回答
5180 浏览
提问于 2025-04-16 01:32

我在使用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 去掉),这样就应该能正常工作了。

撰写回答