Codificación de dolores de cabeza con ‘carácter en Python, Excel

Estoy leyendo un archivo txt en Python, extraigo partes de él y luego emito los resultados como CSV.

El problema es que tengo problemas de encoding que no sé cómo resolver. Esto es lo que pasa:

  1. El archivo de entrada es una exportación de Adobe Acrobat, donde imprimo un “archivo de texto sin formato” después de cambiar la configuración a “UTF-8”.

  2. Entonces leí esto en Python como tal

    inputfile=codecs.open(inputfile, "r", "utf-8") 
  3. Ejecuto una expresión regular para extraer partes de ella, las convierto en un DataFrame pandas (llamado ‘dataframe’ aquí).

  4. Luego escribe el dataframe como un archivo csv, pero no importa cómo lo haga, tengo problemas. Lo intenté

     outputfile=codecs.open(outputfile, "w", "utf-8") dataframe.to_csv(outputfile, encoding="utf-8") 

pero eso me da una

 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 23: ordinal not in range(128) 

Pregunta:

Esto es lo primero que no entiendo: ¿por qué hay un códec ‘ascii’ involucrado si estoy configurando la encoding="utf-8" to_csv encoding="utf-8" ? Acc a los documentos , este es un

Una cadena que representa la encoding a usar en el archivo de salida, por defecto es ‘ascii’ en Python 2 …

Puedo evitar este error al no especificar “utf-8” en codecs.open() . Pero luego, una vez que importé el archivo a Excel (configurando la importación a “Unicode-Utf-8”), todos los caracteres aparecen como __. No hay otros errores de encoding por lo que puedo ver y si abro el archivo csv en TextWrangler, todo funciona bien.

  • ¿Dónde está el problema aquí? ¿Es el resultado de los pandas, es Excel o qué más?

  • ¿Hay una mejor manera de abordar esto?

Estoy trabajando en Python 2 en una Mac. No utilicé el módulo csv de Python porque no hace UTF sin una solución alternativa.

Cualquier ayuda es apreciada!

EDITAR: Aquí es cómo se ve el archivo de entrada en WordWrangler:

23 Está tirado allí en el suelo.

Aquí está Excel:

Está acostado en el suelo.

Después del útil comentario de Fawful, también intenté abrir el archivo de texto original en Excel. Parece que ya codifica el ‘como __ en ese.

No es una solución limpia, pero para una solución rápida solo use .replace (‘\ 0xe2’, ”).

Al escribir el archivo desde el dataframe de pandas, no utilice un objeto de archivo de codecs . pandas.to_csv() ya codifica sus datos, y el objeto de archivo de codecs debe intentar decodificar (como ASCII) para poder volver a codificarlos .

Solo usa un archivo regular:

 with open(outputfile, "w") as outputfile: dataframe.to_csv(outputfile, encoding="utf-8") 

También puede usar el módulo csv , pero luego tiene que codificar todos los datos de su fila a UTF-8 antes de pasar la fila a la función csv.writer().writerow() . La sección de ejemplos del módulo csv incluye código que automatiza esto para usted.

Así que parece que esto es un problema de Excel (al menos Mac Excel 2011); Parece que si bien ofrece una configuración “Unicode UTF-8”, en realidad no puede tratar con caracteres Unicode.

Ver, por ejemplo, esta publicación SO y esta publicación de Microsoft. Mis archivos se abren muy bien en números. Ni siquiera sabía que tenía eso en esta máquina …