Pregunta

En un archivo de texto, hay una cadena " No me gusta esto " ;.

Sin embargo, cuando lo leo en una cadena, se convierte en " I don \ xe2 \ x80 \ x98t como este " ;. Entiendo que \ u2018 es la representación unicode de '' '' '. Yo uso

f1 = open (file1, "r")
text = f1.read()

comando para hacer la lectura.

Ahora, ¿es posible leer la cadena de tal manera que cuando se lee en la cadena, es "No me gusta esto", en lugar de "No me gusta \ xe2 \ x80 \ x98t como esto como esto " ;?

Segunda edición: he visto a algunas personas usar el mapeo para resolver este problema, pero realmente, ¿no hay una conversión integrada que realice este tipo de conversión de ANSI a unicode (y viceversa)?

¿Fue útil?

Solución

Ref: http://docs.python.org/howto/unicode

Por lo tanto, leer Unicode desde un archivo es simple:

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
    print repr(line)

También es posible abrir archivos en modo de actualización, permitiendo la lectura y la escritura:

f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()

EDIT : supongo que tu objetivo es simplemente 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, intente uno de los siguientes:

  1. Reemplace los caracteres específicos de Unicode con equivalentes ASCII, si solo está buscando manejar algunos casos especiales como este ejemplo en particular

  2. Use el método unicodedata del módulo normalize () y el método string.encode () 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-to-ascii-using-python ):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'
    

Otros consejos

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 escribes:

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

Ahora, si simplemente desea imprimir la cadena de Unicode con precisión, simplemente use el método encode de unicode:

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this

Para asegurarse de que cada línea de cualquier archivo se lea como unicode, será mejor que use la función codecs.open en lugar de simplemente abrir , que le permite para especificar la codificación del archivo:

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this

Pero realmente es '' No me gusta esto '' y no "No me gusta esto". El carácter u '\ u2018' es un carácter completamente diferente de '' '' ' (y, visualmente, debería corresponder más a '' ').

Si está intentando convertir unicode codificado en ASCII simple, quizás pueda mantener un mapa de puntuación de Unicode que le gustaría traducir a ASCII.

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

Hay una gran cantidad de caracteres de puntuación en unicode , sin embargo, 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.

Dejando de lado el hecho de que su archivo de texto está roto (U + 2018 es una comilla izquierda, no un apóstrofe): se puede usar iconv para transliterar caracteres unicode a ascii.

Tendrás que buscar en Google para " iconvcodec " ;, ya que parece que el módulo ya no es compatible y no puedo encontrar una página de inicio canónica para él.

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

Alternativamente, puede usar la utilidad de línea de comando iconv para limpiar su archivo:

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.

Existe la posibilidad de que de alguna manera tenga una cadena no unicode con caracteres de escape unicode, por ejemplo:

>>> print repr(text)
'I don\\u2018t like this'

Esto realmente me pasó una vez antes. Puede usar un códec unicode_escape para decodificar la cadena a Unicode y luego codificarla en el formato que desee:

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this

Esta es la forma en que Pythons te muestra cadenas codificadas en Unicode. Pero creo que debería poder imprimir la cadena en la pantalla o escribirla en un archivo nuevo sin ningún problema.

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this

En realidad, U + 2018 es la representación Unicode del carácter especial & # 8216; . Si lo desea, puede convertir instancias de ese personaje a U + 0027 con este código:

text = text.replace (u"\u2018", "'")

Además, ¿qué estás usando para escribir el archivo? f1.read () debería devolver una cadena como esta:

'I don\xe2\x80\x98t like this'

Si está devolviendo esta cadena, el archivo se está escribiendo incorrectamente:

'I don\u2018t like this'

También es posible leer un archivo de texto codificado utilizando el método de lectura de python 3:

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

Con esta variación, no es necesario importar bibliotecas adicionales

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top