xf3 xf1 xe1 xc3 xad u00f3 codificacion caracteres acentos python unicode encoding file ascii

xf1 - xc3 xad python



¿Cómo convierto el formato de un archivo de Unicode a ASCII usando Python? (8)

Aquí hay un código simple (y estúpido) para hacer la traducción de codificación. Asumo (pero no debería) que el archivo de entrada está en UTF-16 (Windows lo llama simplemente ''Unicode'').

input_codec = ''UTF-16'' output_codec = ''ASCII'' unicode_file = open(''filename'') unicode_data = unicode_file.read().decode(input_codec) ascii_file = open(''new filename'', ''w'') ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))

Tenga en cuenta que esto no funcionará si hay caracteres en el archivo Unicode que no sean también caracteres ASCII. Puede hacer lo siguiente para convertir caracteres no reconocidos en ''?'' S:

ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, ''replace'')))

Consulte los documentos para obtener opciones más simples. Si necesita hacer algo más sofisticado, puede consultar El martillo UNICODE en el Python Cookbook.

Utilizo una herramienta de terceros que genera un archivo en formato Unicode. Sin embargo, prefiero que esté en ASCII. La herramienta no tiene configuraciones para cambiar el formato de archivo.

¿Cuál es la mejor forma de convertir el formato de archivo completo usando Python?


Como han señalado otros carteles, ASCII es un subconjunto de Unicode.

Sin embargo, si usted:

  • tener una aplicación heredada
  • no controlas el código para esa aplicación
  • está seguro de que su información entra en el subconjunto ASCII

Luego, el siguiente ejemplo muestra cómo hacerlo:

mystring = u''bar'' type(mystring) <type ''unicode''> myasciistring = (mystring.encode(''ASCII'')) type(myasciistring) <type ''str''>


Es importante tener en cuenta que no hay un formato de archivo ''Unicode''. Unicode se puede codificar a bytes de varias maneras diferentes. Más comúnmente UTF-8 o UTF-16. Necesitará saber cuál está generando su herramienta de terceros. Una vez que sepa eso, la conversión entre codificaciones diferentes es bastante fácil:

in_file = open("myfile.txt", "rb") out_file = open("mynewfile.txt", "wb") in_byte_string = in_file.read() unicode_string = bytestring.decode(''UTF-16'') out_byte_string = unicode_string.encode(''ASCII'') out_file.write(out_byte_string) out_file.close()

Como se indicó en las otras respuestas, es probable que desee proporcionar un controlador de errores al método de codificación. Usar ''reemplazar'' como manejador de errores es simple, pero destruirá su texto si contiene caracteres que no se pueden representar en ASCII.


Me gusta esto:

uc = open(filename).read().decode(''utf8'') ascii = uc.decode(''ascii'')

Sin embargo, tenga en cuenta que esto fallará con una excepción UnicodeDecodeError si hay algún carácter que no se pueda convertir a ASCII.

EDITAR: Como Pete Karl acaba de señalar, no hay una correspondencia uno a uno desde Unicode a ASCII. Por lo tanto, algunos personajes simplemente no se pueden convertir de una manera que preserve la información. Además, ASCII estándar es más o menos un subconjunto de UTF-8, por lo que realmente no necesita hacer ninguna decodificación.


Para mi problema, en el que solo quería omitir los caracteres que no son ASCII y simplemente generar solo salida ASCII, la siguiente solución funcionó muy bien:

import unicodedata input = open(filename).read().decode(''UTF-16'') output = unicodedata.normalize(''NFKD'', input).encode(''ASCII'', ''ignore'')


Por cierto, se trata de un icono de comando de Linux para hacer este tipo de trabajo.

iconv -f utf8 -t ascii <input.txt >output.txt


Creo que este es un problema más profundo de lo que crees . Simplemente cambiar el archivo de Unicode a ASCII es fácil, sin embargo, obtener todos los caracteres Unicode para traducir en contrapartes ASCII razonables (muchas letras no están disponibles en ambas codificaciones) es otro.

Este tutorial de Python Unicode puede darle una mejor idea de lo que sucede con las cadenas Unicode que se traducen a ASCII: http://www.reportlab.com/i18n/python_unicode_tutorial.html

Aquí hay una cita útil del sitio:

Python 1.6 también obtiene una función integrada "unicode", a la que puede especificar la codificación:

> >>> unicode(''hello'') u''hello'' > >>> unicode(''hello'', ''ascii'') u''hello'' > >>> unicode(''hello'', ''iso-8859-1'') u''hello'' > >>>

Los tres devuelven lo mismo, ya que los caracteres en ''Hola'' son comunes a las tres codificaciones.

Ahora codifiquemos algo con acento europeo, que está fuera de ASCII. Lo que ve en una consola puede depender de la configuración regional de su sistema operativo; Windows me permite escribir en ISO-Latin-1.

> >>> a = unicode(''André'',''latin-1'') > >>> a u''Andr/202''

Si no puede escribir una letra aguda e, puede ingresar la cadena ''Andr / 202'', que no es ambigua.

Unicode admite todas las operaciones comunes, como la iteración y la división. No los atropellaré aquí.


Puede convertir el archivo con la suficiente facilidad simplemente utilizando la función unicode , pero se encontrará con problemas con los caracteres Unicode sin un equivalente ASCII directo.

Este blog recomienda el módulo unicodedata , que parece ocuparse de la conversión aproximada de caracteres sin los valores ASCII correspondientes directos, por ejemplo

>>> title = u"Klüft skräms inför på fédéral électoral große"

típicamente se convierte a

Klft skrms infr p fdral lectoral groe

lo cual es bastante incorrecto Sin embargo, al usar el módulo unicodedata , el resultado puede ser mucho más cercano al texto original:

>>> import unicodedata >>> unicodedata.normalize(''NFKD'', title).encode(''ascii'',''ignore'') ''Kluft skrams infor pa federal electoral groe''