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ó.