En un archivo de texto, hay una cadena de «no me gusta esto».

Sin embargo, cuando la leí 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», en lugar de «I don\xe2\x80\x98t como esto como esto»?

Segundo edit: he visto que algunas personas utilizan la asignación de solucionar este problema, pero en realidad, no hay un built-in de conversión que realiza este tipo de ANSI a unicode ( y viceversa) la conversión?

  • Algunos comentarios: he visto que algunas personas utilizan la asignación de solucionar este problema, pero en realidad, no hay un built-in de conversión que realiza este tipo de ANSI a unicode ( y viceversa) la conversión? Gracias!
  • No hay, porque hay cientos de miles de puntos de código Unicode. ¿Cómo decide que debe asignarse a qué caracteres ASCII?
  • por cierto, el archivo de texto está roto! U+2018 es la «IZQUIERDA comilla simple», no un apóstrofo (U+0027 más comúnmente).
  • juan, tu comentario es malo, al menos en el sentido general. el iconv lib puede ser utilizado para transcribir los caracteres unicode a ascii (incluso depende de la configuración regional. $ python -c ‘print u»\u2018″.encode(«utf-8»)’ | iconv -t ‘ascii//translit’ | xxd 0000000: 270 bis
  • la cosa es, usted necesita para convertir a UNICODE a ASCII (no al revés).
InformationsquelleAutor Graviton | 2008-09-29

8 Comentarios

  1. 146

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

    La lectura de Unicode de un archivo es por lo tanto simple:

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

    También es posible abrir los archivos en modo de actualización, lo que permite tanto 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()

    EDITAR: estoy asumiendo que su objetivo es sólo para ser capaz de leer el archivo correctamente en una cadena de texto en Python. Si usted está tratando de convertir a una cadena ASCII de Unicode, entonces realmente no hay una forma directa de hacerlo, ya que los caracteres Unicode que no necesariamente existe en ASCII.

    Si usted está tratando de convertir a una cadena ASCII, pruebe uno de los siguientes:

    1. Reemplazar el específico de caracteres unicode con ASCII equivalentes, si sólo está buscando para manejar algunos casos especiales como el de este ejemplo en particular

    2. Utilizar el unicodedata del módulo normalize() y la string.encode() método para convertir la mejor manera para el más cercano equivalente en ASCII (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'
    • Gracias. Su unicodedata solución funciona!
    • Usted salvó mi vida!
    • codecs módulo no manejar universal saltos de línea en el modo correctamente. Uso io.open() lugar en Python 2.7+ (es builtin open() en Python 3).
  2. 15

    Hay un par de puntos a considerar.

    Un \u2018 carácter puede aparecer sólo como un fragmento de la representación de una cadena unicode en Python, por ejemplo, si usted escribe:

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

    Ahora bien, si usted simplemente desea imprimir la cadena unicode bellamente, sólo tiene que utilizar unicode encode método:

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

    Para asegurarse de que cada línea de cualquier archivo para ser leído como unicode, es mejor que utilice la codecs.open función en lugar de sólo open, que le permite 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 dont like this
  3. 6

    Pero lo que realmente es «I don\u2018t como esto» y no «no me gusta esto». El carácter u’\u2018′ es un personaje totalmente diferente de «‘» (y, visualmente, debe corresponder más a «‘).

    Si usted está tratando de convertir a unicode codificados en formato ASCII, quizás podría mantener una asignación de unicode signos de puntuación que desea traducir en ASCII.

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

    Hay un montón de caracteres de puntuación en unicode, sin embargo, pero supongo que se puede contar con sólo unos pocos de ellos realmente ser utilizado por cualquier aplicación es la creación de los documentos que usted está leyendo.

    • en realidad, si se hace el dict mapa Unicode ordinales a Unicode ordinales ({0x2018: 0x27, 0x2019: 0x27}) sólo se puede pasar todo el diccionario de texto.translate() para hacer todo el cambio de una sola vez.
  4. 3

    Dejando de lado el hecho de que el archivo de texto está roto (U+2018 es una izquierda comillas, no un apóstrofo): iconv puede ser utilizado para transcribir los caracteres unicode a ascii.

    Tendrás a google para «iconvcodec», ya que el módulo no parece ser compatible y no puedo encontrar una canónica de la página de inicio para ello.

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

    Alternativamente, usted puede utilizar el iconv utilidad de línea de comandos para limpiar su archivo:

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

    Hay una posibilidad de que de alguna manera usted no tiene una cadena unicode unicode caracteres de escape, por ejemplo:

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

    De hecho, esto me pasó a mí una vez antes. Usted puede utilizar un unicode_escape códec para decodificar la cadena de unicode y luego codificar a cualquier formato que usted desee:

    >>> uni = text.decode('unicode_escape')
    >>> print type(uni)
    <type 'unicode'>
    >>> print uni.encode('utf-8')
    I dont like this
  6. 1

    Este es Pitones forma de mostrar que con codificación unicode cadenas. Pero creo que usted debe ser capaz de imprimir la cadena en la pantalla o escribir en un archivo nuevo sin ningún tipo de problemas.

    >>> test = u"I don\u2018t like this"
    >>> test
    u'I don\u2018t like this'
    >>> print test
    I dont like this
  7. 1

    Realidad, U+2018 es la representación Unicode del carácter especial ‘ . Si usted desea, usted puede convertir instancias de ese carácter U+0027 con este código:

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

    Además, ¿qué estás usando para escribir el archivo? f1.read() debe devolver una cadena que se parece a esto:

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

    Si es que regresan este cadena, el archivo está siendo escrito incorrectamente:

    'I don\u2018t like this'
    • Lo siento! Como usted dijo, se está volviendo ‘no\xe2\x80\x98t como este»
    • El ‘no\xe2\x80\x98t como este que estamos viendo es lo que Python sería llamar a un str. Parece ser que la codificación utf-8 de u I don\u2018t como este», que es una unicode ejemplo en Python. Trate de llamar .decode(‘utf-8’) en la primera .encode(‘utf-8’) en el último.
    • U+0039 es el dígito 9.
    • ups, olvidé ord() devuelve decimal en lugar de hex. Gracias por la captura.
  8. 1

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

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

    Con esta variación, no hay necesidad de importación de bibliotecas adicionales

Dejar respuesta

Please enter your comment!
Please enter your name here