2011-01-10 13 views
6

He estado leyendo todas las preguntas con respecto a la conversión de Unicode a CSV en Python aquí en StackOverflow y todavía estoy perdido. Cada vez que recibo un "UnicodeEncodeError: códec 'ascii' no puede codificar caracteres u '\ xd1' en la posición 12: no ordinal en el rango (128)"Python: Convertir Unicode en ASCII sin errores para el archivo CSV

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 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 archivo CSV, preferiblemente con el ñ ("LIMPIADOR BAÑO 1'5 L"), pero si no es posible, al menos poder guardarlo ("LIMPIADOR BAO 1'5 L ").

+0

¿Cuál es tu pregunta? –

+0

Actualizado con una pregunta al final. – Sergi

+1

¿Por qué no intentas codificar en la página de códigos 'ANSI' de Windows? Supongo que estás usando Windows porque CSV es el más comúnmente utilizado en Windows, pero por favor ignórame si esto no es suficiente. En un SO * NIX creo que una de las codificaciones ISO de 8 bits sería apropiada, pero no soy un experto. –

Respuesta

12

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, para eliminar los acentos, se puede encontrar aquí: What is the best way to remove accents in a Python unicode string?

Pero tenga en cuenta que ambas técnicas pueden dar lugar a efectos negativos, como la fabricación de palabras realmente significan algo diferente, etc. Así que lo mejor es mantener 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" para la codificación que desee.


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

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

donde

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

Ahora, yo creo que debería funcionar, pero al parecer no es así. Creo que unicode pasa al escritor cvs por error de todos modos. Desenvolver esa línea larga de sus partes:

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

Ahora su verdadero error no se ocultará por el hecho de que se quede todo en la misma línea. Esto también podría haber sido evitado si hubiera incluido un rastreo apropiado.

+0

La mayoría de los lectores CSV no pueden manejar UTF-8. CSV se lee con mayor frecuencia en Windows, por lo que una de las denominadas codificaciones ANSI parece ser la más adecuada. –

+0

Bueno, no sé sobre "la mayoría", pero algunos al menos. Y CSV se usa en todas partes. Obviamente, se debe utilizar una codificación que pueda leer el software de destino. –

+0

El problema es que el código anterior, usando la cadena unicode u "LIMPIADOR BA \ xd1O 1'5 L" falla miserablemente con el error UnicodeEncodeError también detallado arriba (la bandera "ignorar" no funciona, no sé por qué) .En condiciones ideales, me gustaría obtener un archivo CSV con la cadena completa, incluida la ñ. – Sergi

Cuestiones relacionadas