unidecode unicodeencodeerror python3 bytes python unicode csv ascii diacritics

unicodeencodeerror - Python: convierte Unicode en ASCII sin errores para el archivo CSV



unidecode python 3 (1)

He estado leyendo todas las preguntas sobre la conversión de Unicode a CSV en Python aquí en StackOverflow y todavía estoy perdido. Cada vez que recibo un códec "UnicodeEncodeError: ''ascii'' no puede codificar el carácter u ''/ xd1'' en la posición 12: ordinal no en el rango (128)"

buffer=cStringIO.StringIO() writer=csv.writer(buffer, csv.excel) cr.execute(query, query_param) while (1): row = cr.fetchone() writer.writerow([s.encode(''ascii'',''ignore'') for s in row])

El valor de la fila es

(56, u"LIMPIADOR BA/xd1O 1''5 L")

donde el valor de / xd10 en la base de datos es ñ, con una tilde diacrítica utilizada en español. Al principio traté de convertir el valor a algo válido en ASCII, pero después de perder tanto tiempo trato de ignorar a esos personajes (supongo que tendría el mismo problema con las vocales acentuadas).

Me gustaría guardar el valor en el CSV, preferiblemente con el ñ ("LIMPIADOR BAÑO 1''5 L"), pero si no es posible, al menos poder guardarlo ("LIMPIADOR BAO 1''5 L").


Correcto, ñ no es un carácter ASCII válido, por lo que no puede codificarlo en ASCII. Así que puedes, como tu código hace arriba, ignorarlos. Otra forma, es decir, eliminar los acentos, puede encontrarlo aquí: ¿Cuál es la mejor manera de eliminar acentos en una cadena de Unicode de Python?

Pero tenga en cuenta que ambas técnicas pueden dar lugar a malos efectos, como hacer que las palabras en realidad signifiquen algo diferente, etc. Así que lo mejor es conservar los acentos. Y luego no puede usar ASCII, pero puede usar otra codificación. UTF-8 es la apuesta segura. Latin-1 o ISO-88591-1 es común, pero incluye solo caracteres de Europa occidental. CP-1252 es común en Windows, etc., etc.

Así que simplemente cambie "ascii" por la codificación que desee.

Su código actual, de acuerdo con su comentario es:

writer.writerow([s.encode(''utf8'') if type(s) is unicode else s for s in row])

dónde

row = (56, u"LIMPIADOR BA/xd1O 1''5 L")

Ahora, creo que debería funcionar, pero aparentemente no funciona. Creo que unicode pasa al escritor cvs por error de todos modos. Desenvuelve esa larga línea a sus partes:

col1, col2 = row # Use the names of what is actually there instead row = col1, col2.encode(''utf8'') writer.writerow(row)

Ahora su error real no estará oculto por el hecho de que usted pegue todo en la misma línea. Esto también podría haber sido evitado si hubiera incluido un rastreo apropiado.