diff --git a/eco/utils/csv_utf.py b/eco/utils/csv_utf.py new file mode 100644 index 00000000..a7d8964c --- /dev/null +++ b/eco/utils/csv_utf.py @@ -0,0 +1,31 @@ +import csv, codecs, cStringIO + + +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_tab, 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') if isinstance(s, unicode) else s 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) \ No newline at end of file