title: Create an utf-8 csv file in Python
body: <p>I can't create an utf-8 csv file in Python.</p>
  
  <p>I'm trying to read it's docs, and in the <a href="http://docs.python.org/library/csv.html#csv-examples" rel="noreferrer">examples section</a>, it says:</p>
  
  <blockquote>
    <p>For all other encodings the following
    UnicodeReader and UnicodeWriter
    classes can be used. They take an
    additional encoding parameter in their
    constructor and make sure that the
    data passes the real reader or writer
    encoded as UTF-8:</p>
  </blockquote>
  
  <p>Ok. So I have this code:</p>
  
  <pre><code>values = (unicode("Ñ", "utf-8"), unicode("é", "utf-8"))
  f = codecs.open('eggs.csv', 'w', encoding="utf-8")
  writer = UnicodeWriter(f)
  writer.writerow(values)
  </code></pre>
  
  <p>And I keep getting this error:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>Can someone please give me a light so I can understand what the hell am I doing wrong since I set all the encoding everywhere before calling UnicodeWriter class?</p>
  
  <pre><code>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)
  </code></pre>