No dudes en compartir nuestros post y códigos con tus amigos, necesitamos de tu ayuda para ampliar nuestra comunidad.
Solución:
los .encode
el método se aplica a un Unicode string para hacer un byte-string; pero lo estás llamando en un byte-string en cambio… ¡al revés! mira el codecs
módulo en la biblioteca estándar y codecs.open
en particular para mejores soluciones generales para leer archivos de texto codificados en UTF-8. Sin embargo, para el csv
módulo en particular, necesita pasar datos utf-8, y eso es lo que ya está obteniendo, por lo que su código puede ser mucho más simple:
import csv
def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
for row in csv_reader:
yield [unicode(cell, 'utf-8') for cell in row]
filename = 'da.csv'
reader = unicode_csv_reader(open(filename))
for field1, field2, field3 in reader:
print field1, field2, field3
PD: si resulta que sus datos de entrada NO están en utf-8, pero, por ejemplo, en ISO-8859-1, entonces necesita una “transcodificación” (si está interesado en usar utf-8 en el csv
nivel de módulo), de la forma line.decode('whateverweirdcodec').encode('utf-8')
— pero probablemente pueda usar el nombre de su codificación existente en el yield
línea en mi código anterior, en lugar de 'utf-8'
como csv
en realidad va a estar bien con cadenas de bytes codificadas ISO-8859-*.
Pitón 2.X
Hay una biblioteca unicode-csv que debería resolver sus problemas, con el beneficio adicional de no tener que navegar para escribir ningún código nuevo relacionado con csv.
Aquí hay un ejemplo de su archivo Léame:
>>> import unicodecsv
>>> from cStringIO import StringIO
>>> f = StringIO()
>>> w = unicodecsv.writer(f, encoding='utf-8')
>>> w.writerow((u'é', u'ñ'))
>>> f.seek(0)
>>> r = unicodecsv.reader(f, encoding='utf-8')
>>> row = r.next()
>>> print row[0], row[1]
é ñ
Pitón 3.X
En python 3, esto es compatible de forma inmediata con la función incorporada csv
módulo. Mira este ejemplo:
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Si desea leer un archivo CSV con codificación utf-8, un enfoque minimalista que le recomiendo es usar algo como esto:
with open(file_name, encoding="utf8") as csv_file:
Con esa declaración, puede usar más tarde un lector de CSV para trabajar.
Sección de Reseñas y Valoraciones
Finalizando este artículo puedes encontrar las explicaciones de otros sys admins, tú aún eres capaz insertar el tuyo si lo crees conveniente.