CSV,DictWriter,unicode和utf-8

Joe*_*oel 5 python csv 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()
Run Code Online (Sandbox Code Playgroud)

给这个回溯:

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)
Run Code Online (Sandbox Code Playgroud)

我有点迷失,因为DictWriter应该能够使用我在文档中读到的UTF-8.

Ale*_*lli 9

你获得的对象在其方法中需要codecs.open一个unicode字符串write- 这就是重点. csv.DictWriter当然是用utf8编码的字节串来调用该方法,而不是异常.

f创作转变为f = open("test.csv", 'wb')(codecs从图片中删除),事情应该运转得很好.

  • @Philipp,呃?不知道你的"应该"来自哪里,因为基本上NO函数的行为与你说"一般应该"的方式一样 - 每个人总是将字节转换为unicode或VV,因为这样! - 在这种情况下,_and_ csv接受的内容完全无关紧要(这完全取决于**编解码器**接受的内容,而_their_目的正是为了接受unicode字符串!).总的来说,这使你的评论成为我多年来见过的最奇怪的评论. (2认同)
  • @Philipp,VV ="反之亦然";-).似乎接受字节和unicode字符串的大多数函数实际上将一种类型转换为另一种类型(通过'ascii' - eep ;-),尽管在某些平台或其他平台上非常特殊但可能提供更智能的方法(但它们将是一个确实很少,因为正确的翻译方式通常不明显! - ). (2认同)