Créer un utf-8 fichier csv en Python

Je ne peux pas créer un utf-8 fichier csv en Python.

Je suis en train de le lire c'est docs, et dans le les exemples de la section, il dit:

Pour tous les autres codages suivants
UnicodeReader et UnicodeWriter
les classes peuvent être utilisées. Ils prennent un
supplémentaires paramètre d'encodage dans leur
constructeur et assurez-vous que le
les données sont transmises à la vraie lecture ou d'écriture
codé en UTF-8:

Ok. J'ai donc ce code:

values = (unicode("Ñ", "utf-8"), unicode("é", "utf-8"))
f = codecs.open('eggs.csv', 'w', encoding="utf-8")
writer = UnicodeWriter(f)
writer.writerow(values)

Et je reçois cette erreur:

line 159, in writerow
    self.stream.write(data)
  File "/usr/lib/python2.6/codecs.py", line 686, in write
    return self.writer.write(data)
  File "/usr/lib/python2.6/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 22: ordinal not in range(128)

Quelqu'un peut-il me donner un peu afin que je puisse comprendre ce que l'enfer je fais mal depuis que j'ai mis tous le codage de partout avant d'appeler UnicodeWriter classe?

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
    """

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
        # Redirect output to a queue
        self.queue = cStringIO.StringIO()
        self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
        self.stream = f
        self.encoder = codecs.getincrementalencoder(encoding)()

    def writerow(self, row):
        self.writer.writerow([s.encode("utf-8") for s in row])
        # Fetch UTF-8 output from the queue ...
        data = self.queue.getvalue()
        data = data.decode("utf-8")
        # ... and reencode it into the target encoding
        data = self.encoder.encode(data)
        # write to the target stream
        self.stream.write(data)
        # empty queue
        self.queue.truncate(0)

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)
  • Il parlent de problème de codecs.ouvert. Lorsque je le supprime et il suffit d'utiliser ouverte, il fonctionne. Pourquoi?