write leer example dictreader create python unicode csv

leer - Python CSV DictReader con datos UTF-8



python csv writer example (4)

AFAIK, el módulo Python (v2.6) csv no puede manejar datos Unicode por defecto, ¿correcto? En los documentos de Python, hay un example sobre cómo leer desde un archivo codificado en UTF-8. Pero este ejemplo solo devuelve las filas de CSV como una lista. Me gustaría acceder a las columnas de la fila por nombre, ya que está hecho por csv.DictReader pero con el archivo de entrada CSV codificado en UTF-8.

¿Alguien puede decirme cómo hacer esto de una manera eficiente? Tendré que procesar archivos CSV en 100''s de MByte en tamaño.


El paquete csvw tiene otras funciones (para CSV enriquecido con metadatos para la Web), pero define una clase UnicodeDictReader a su clase UnicodeReader , que en su núcleo hace exactamente eso:

class UnicodeReader(Iterator): """Read Unicode data from a csv file.""" […] def _next_row(self): self.lineno += 1 return [ s if isinstance(s, text_type) else s.decode(self._reader_encoding) for s in next(self.reader)]

Me sorprendió un par de veces, pero csvw.UnicodeDictReader realmente, realmente necesita ser utilizado en un bloque y se rompe de lo contrario. Aparte de eso, el módulo es muy genérico y compatible tanto con py2 como con py3.


En primer lugar, use la versión 2.6 de la documentación . Puede cambiar para cada lanzamiento. Dice claramente que no es compatible con Unicode, pero sí es compatible con UTF-8. Technically , estos no son lo mismo. Como dicen los doctores:

El módulo csv no admite directamente la lectura y escritura de Unicode, pero es un ahorro de 8 bits para algunos problemas con los caracteres ASCII NUL. De modo que puede escribir funciones o clases que manejen la codificación y decodificación siempre que evite codificaciones como UTF-16 que usan NUL. UTF-8 es recomendado.

El siguiente ejemplo (de los documentos) muestra cómo crear dos funciones que leen correctamente el texto como UTF-8 como CSV. Debe saber que csv.reader() siempre devuelve un objeto DictReader.

import csv def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs): # csv.py doesn''t do Unicode; encode temporarily as UTF-8: csv_reader = csv.DictReader(utf_8_encoder(unicode_csv_data), dialect=dialect, **kwargs) for row in csv_reader: # decode UTF-8 back to Unicode, cell by cell: yield [unicode(cell, ''utf-8'') for cell in row]


Un enfoque basado en clases para la respuesta de @LMatter, con este enfoque aún obtienes todos los beneficios de DictReader, como obtener los nombres de los campos y obtener el número de línea además de que maneja UTF-8

import csv class UnicodeDictReader(csv.DictReader, object): def next(self): row = super(UnicodeDictReader, self).next() return {unicode(key, ''utf-8''): unicode(value, ''utf-8'') for key, value in row.iteritems()}


Yo mismo presenté una respuesta:

def UnicodeDictReader(utf8_data, **kwargs): csv_reader = csv.DictReader(utf8_data, **kwargs) for row in csv_reader: yield {unicode(key, ''utf-8''):unicode(value, ''utf-8'') for key, value in row.iteritems()}

Nota: Esto se ha actualizado para que las claves se decodifiquen según la sugerencia en los comentarios