En un archivo de texto, hay una cadena "No me gusta esto".
Sin embargo, cuando lo leo en una cadena, se convierte en "No me gusta esto \ xe2 \ x80 \ x98t". Entiendo que \ u2018 es la representación Unicode de "'". yo suelo
f1 = open (file1, "r")
text = f1.read()
comando para hacer la lectura.
Ahora, ¿es posible leer la cadena de tal manera que cuando se lea en la cadena, sea "No me gusta esto", en lugar de "No me gusta \ xe2 \ x80 \ x98t así"?
Segunda edición: He visto a algunas personas usar el mapeo para resolver este problema, pero realmente, ¿no hay una conversión incorporada que haga este tipo de conversión de ANSI a Unicode (y viceversa)?
Respuestas:
Ref: http://docs.python.org/howto/unicode
Por lo tanto, leer Unicode de un archivo es simple:
También es posible abrir archivos en modo de actualización, permitiendo tanto leer como escribir:
EDITAR : Supongo que su objetivo previsto es solo poder leer el archivo correctamente en una cadena en Python. Si está intentando convertir a una cadena ASCII desde Unicode, entonces realmente no hay una forma directa de hacerlo, ya que los caracteres Unicode no necesariamente existirán en ASCII.
Si está intentando convertir a una cadena ASCII, pruebe una de las siguientes opciones:
Reemplace los caracteres Unicode específicos con equivalentes ASCII, si solo está buscando manejar algunos casos especiales como este ejemplo en particular
Utilice el
unicodedata
módulonormalize()
y elstring.encode()
método para convertir lo mejor que pueda al siguiente equivalente ASCII más cercano (Ref https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting- unicode-a-ascii-usando-python ):fuente
codecs
El módulo no maneja correctamente el modo de nueva línea universal. Úselo en suio.open()
lugar en Python 2.7+ (está integradoopen()
en Python 3).Hay algunos puntos a considerar.
Un carácter \ u2018 puede aparecer solo como un fragmento de representación de una cadena Unicode en Python, por ejemplo, si escribe:
Ahora, si simplemente desea imprimir la cadena Unicode de manera bonita, simplemente use el
encode
método Unicode :Para asegurarse de que cada línea de cualquier archivo se lea como Unicode, es mejor que use la
codecs.open
función en lugar de soloopen
, lo que le permite especificar la codificación del archivo:fuente
Pero realmente es "No me gusta esto" y no "No me gusta esto". El carácter u '\ u2018' es un carácter completamente diferente a "'" (y, visualmente, debería corresponder más a' `').
Si está tratando de convertir unicode codificado en ASCII simple, tal vez podría mantener un mapeo de puntuación Unicode que le gustaría traducir a ASCII.
Sin embargo, hay una gran cantidad de caracteres de puntuación en Unicode , pero supongo que puede contar con que solo algunos de ellos sean utilizados por cualquier aplicación que esté creando los documentos que está leyendo.
fuente
También es posible leer un archivo de texto codificado usando el método de lectura de Python 3:
Con esta variación, no es necesario importar bibliotecas adicionales
fuente
Dejando a un lado el hecho de que su archivo de texto está roto (U + 2018 es una comilla izquierda, no un apóstrofe): iconv se puede usar para transliterar caracteres Unicode a ASCII.
Tendrá que buscar en Google "iconvcodec", ya que el módulo parece que ya no es compatible y no puedo encontrar una página de inicio canónica para él.
Alternativamente, puede usar la
iconv
utilidad de línea de comando para limpiar su archivo:fuente
Existe la posibilidad de que de alguna manera tenga una cadena no Unicode con caracteres de escape Unicode, por ejemplo:
En realidad, esto me pasó una vez antes. Puede usar un
unicode_escape
códec para decodificar la cadena en Unicode y luego codificarla en el formato que desee:fuente
Esta es la forma en que Python le muestra cadenas codificadas en Unicode. Pero creo que debería poder imprimir la cadena en la pantalla o escribirla en un nuevo archivo sin ningún problema.
fuente
En realidad, U + 2018 es la representación Unicode del carácter especial '. Si lo desea, puede convertir instancias de ese carácter a U + 0027 con este código:
Además, ¿qué estás usando para escribir el archivo?
f1.read()
debería devolver una cadena que se parece a esto:Si devuelve esta cadena, el archivo se está escribiendo incorrectamente:
fuente