Estoy intentando leer un archivo CSV con caracteres acentuados con Python (solo caracteres franceses y / o españoles). Basado en la documentación de Python 2.5 para el csvreader ( http://docs.python.org/library/csv.html ), se me ocurrió el siguiente código para leer el archivo CSV ya que csvreader solo admite ASCII.
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.reader(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]
def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
filename = 'output.csv'
reader = unicode_csv_reader(open(filename))
try:
products = []
for field1, field2, field3 in reader:
...
A continuación se muestra un extracto del archivo CSV que estoy tratando de leer:
0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert
...
Aunque intento codificar / decodificar en UTF-8, sigo recibiendo la siguiente excepción:
Traceback (most recent call last):
File ".\Test.py", line 53, in <module>
for field1, field2, field3 in reader:
File ".\Test.py", line 40, in unicode_csv_reader
for row in csv_reader:
File ".\Test.py", line 46, in utf_8_encoder
yield line.encode('utf-8', 'ignore')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 68: ordinal not in range(128)
¿Cómo puedo solucionar esto?
python
utf-8
csv
character-encoding
Martín
fuente
fuente
Respuestas:
El
.encode
método se aplica a una cadena Unicode para hacer una cadena de bytes; pero lo estás llamando en una cadena de bytes en su lugar ... ¡al revés! Mire elcodecs
módulo en la biblioteca estándar y,codecs.open
en particular, para obtener mejores soluciones generales para leer archivos de texto codificados en UTF-8. Sin embargo, para elcsv
módulo en particular, debe pasar datos utf-8, y eso es lo que ya está obteniendo, por lo que su código puede ser mucho más simple: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 a
csv
nivel de módulo) , del formularioline.decode('whateverweirdcodec').encode('utf-8')
, pero probablemente pueda usar el nombre de su codificación existente en layield
línea de mi código anterior, en lugar de'utf-8'
, como encsv
realidad va a estar bien con cadenas de bytes codificadas con ISO-8859- *.fuente
Python 2.X
Existe una biblioteca unicode-csv que debería resolver sus problemas, con el beneficio adicional de no tener que escribir ningún código nuevo relacionado con csv.
Aquí hay un ejemplo de su archivo Léame:
Python 3.X
En python 3, esto es compatible con el
csv
módulo integrado. Vea este ejemplo:fuente
Si desea leer un archivo CSV con codificación utf-8, un enfoque minimalista que le recomiendo es usar algo como esto:
Con esa declaración, puede utilizar más tarde un lector de CSV para trabajar.
fuente
encoding
enopen
open('file.csv', 'r', encoding="ISO8859")
También consulte la respuesta en esta publicación: https://stackoverflow.com/a/9347871/1338557
Sugiere el uso de una biblioteca llamada ucsv.py. Reemplazo corto y simple para CSV escrito para abordar el problema de codificación (utf-8) para Python 2.7. También proporciona soporte para csv.DictReader
Editar : Agregar código de muestra que usé:
fuente
Usar
codecs.open
como sugirió Alex Martelli resultó ser útil para mí.fuente
csv
módulo pero no lo usa.El enlace a la página de ayuda es el mismo para python 2.6 y, hasta donde yo sé, no hubo cambios en el módulo csv desde 2.5 (además de las correcciones de errores). Aquí está el código que simplemente funciona sin codificación / decodificación (el archivo da.csv contiene los mismos datos que los datos variables ). Supongo que su archivo debe leerse correctamente sin conversiones.
test.py:
da.csv:
fuente
delimiter=','
lugar dedialect=csv.excel
.Vale la pena señalar que si nada funcionó para usted, es posible que haya olvidado escapar de su camino.
Por ejemplo, este código:
Resultaría en un error:
Para solucionarlo, simplemente haz lo siguiente:
fuente
Mirando la
Latin-1
tabla Unicode , veo el código de carácter00E9
" LETRA E MINÚSCULA LATINA CON AGUDO ". Este es el carácter acentuado en sus datos de muestra. Una prueba simplePython
muestra que laUTF-8
codificación de este carácter es diferente de laUTF-16
codificación unicode (casi ).Le sugiero que intente con
encode("UTF-8")
los datos Unicode antes de llamar al especialunicode_csv_reader()
. Simplemente leer los datos de un archivo puede ocultar la codificación, así que verifique los valores reales de los caracteres.fuente
Tuve el mismo problema en otro servidor, pero me di cuenta de que las configuraciones regionales están desordenadas.
solucionó el problema
fuente