CSV, DictWriter, Unicode y utf-8

Estoy teniendo problemas con los caracteres DictWriter y no ascii. Una versión corta de mi problema:

#!/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() 

Da este Traceback:

 Traceback (most recent call last): File "test.py", line 10, in 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) 

Estoy un poco perdido ya que el DictWriter debería poder trabajar con UTF-8 de lo que he leído en la documentación.

El objeto que obtiene con codecs.open quiere una cadena Unicode en su método de write , ese es el punto. csv.DictWriter por supuesto, está llamando a ese método con una cadena de bytes codificada en utf8 en su lugar, de ahí la excepción.

Cambie la creación de f = open("test.csv", 'wb') a f = open("test.csv", 'wb') (sacando los codecs de la imagen) y las cosas deberían funcionar bien.