Saltar al contenido

Lectura y escritura Unicode (UTF-8) en archivos en Python

Mantén la atención ya que en este enunciado vas a hallar la respuesta que buscas.

Solución:

En lugar de meterme con los métodos de codificación y decodificación, me resulta más fácil especificar la codificación al abrir el archivo. los io módulo (agregado en Python 2.6) proporciona un io.open función, que tiene un parámetro de codificación.

Utilice el método abierto de la io módulo.

>>>import io
>>>f = io.open("test", mode="r", encoding="utf-8")

Luego, después de llamar a la función read() de f, se devuelve un objeto Unicode codificado.

>>>f.read()
u'Capitxe1lnn'

Tenga en cuenta que en Python 3, el io.open la función es un alias para el incorporado open función. La función abierta integrada solo admite el argumento de codificación en Python 3, no en Python 2.

Editar: Anteriormente, esta respuesta recomendaba el módulo de códecs. El módulo de códecs puede causar problemas al mezclar read() y readline()por lo que esta respuesta ahora recomienda el módulo io en su lugar.

Utilice el método abierto del módulo de códecs.

>>>import codecs
>>>f = codecs.open("test", "r", "utf-8")

Luego, después de llamar a la función read() de f, se devuelve un objeto Unicode codificado.

>>>f.read()
u'Capitxe1lnn'

Si conoce la codificación de un archivo, usar el paquete de códecs será mucho menos confuso.

Consulte http://docs.python.org/library/codecs.html#codecs.open

en la notación

u'Capitxe1nn'

el “xe1” representa solo un byte. “x” te dice que “e1” está en hexadecimal. Cuando escribes

Capitxc3xa1n

en su archivo tiene ” xc3″. Esos son 4 bytes y en tu código los lees todos. Puede ver esto cuando los muestra:

>>> open('f2').read()
'Capit\xc3\xa1nn'

Puede ver que la barra invertida se escapa de una barra invertida. Así que tienes cuatro bytes en tu string: “”, “x”, “c” y “3”.

Editar:

Como otros señalaron en sus respuestas, solo debe ingresar los caracteres en el editor y su editor debe manejar la conversión a UTF-8 y guardarla.

Si en realidad tienes un string en este formato puedes usar el string_escape códec para decodificarlo en un normal string:

In [15]: print 'Capit\xc3\xa1nn'.decode('string_escape')
Capitán

El resultado es un string que está codificado en UTF-8 donde el carácter acentuado está representado por los dos bytes que se escribieron \xc3\xa1 en el original string. Si quieres tener un Unicode string tienes que decodificar de nuevo con UTF-8.

Para su edición: no tiene UTF-8 en su archivo. Para ver realmente cómo se vería:

s = u'Capitxe1nn'
sutf8 = s.encode('UTF-8')
open('utf-8.out', 'w').write(sutf8)

Comparar el contenido del archivo. utf-8.out al contenido del archivo que guardó con su editor.

Ahora todo lo que necesitas en Python3 es open(Filename, 'r', encoding='utf-8')

[Edit on 2016-02-10 for requested clarification]

Python3 agregó el codificación parámetro a su función abierta. La siguiente información sobre la función de apertura se recopila aquí: https://docs.python.org/3/library/functions.html#open

open(file, mode='r', buffering=-1, 
      encoding=None, errors=None, newline=None, 
      closefd=True, opener=None)

Codificación es el nombre de la codificación utilizada para decodificar o codificar el archivo. Esto solo debe usarse en modo de texto. La codificación predeterminada depende de la plataforma (lo que devuelva locale.getpreferredencoding()), pero se puede usar cualquier codificación de texto compatible con Python. Consulte el módulo de códecs para ver la lista de codificaciones admitidas.

Entonces al agregar encoding='utf-8' como parámetro para la función de apertura, la lectura y escritura del archivo se realiza como utf8 (que ahora también es la codificación predeterminada de todo lo que se hace en Python).

Sección de Reseñas y Valoraciones

Acuérdate de que tienes la capacidad de explicar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *