Deseo escribir un programa python que lea archivos que contengan texto unicode. Estos archivos normalmente están codificados con UTF-8, pero podrían no serlo; si no lo están, la codificación alternativa se declarará explícitamente al comienzo del archivo. Más precisamente, se declarará utilizando exactamente las mismas reglas que Python usa para permitir que el código fuente de Python tenga una codificación explícitamente declarada (como en PEP 0263, vea https://www.python.org/dev/peps/pep-0263/ para más detalles). Para que quede claro, los archivos que se procesan no son en realidad fuente de Python, pero sí declaran sus codificaciones (cuando no están en UTF-8) usando las mismas reglas.Lea un archivo Unicode en python que declare su codificación de la misma manera que la fuente python
Si conoce la codificación de un archivo antes de abrirlo, Python proporciona una manera muy fácil de leer el archivo con decodificación automática: el comando codecs.open
; por ejemplo, se podría hacer:
import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
print repr(line)
y cada line
nos ponemos en el bucle habrá una cadena Unicode. ¿Hay una biblioteca de Python que hace algo similar, pero eligiendo la codificación de acuerdo con las reglas anteriores (que son las reglas de Python 3.0, creo)? (por ejemplo, ¿muestra Python el "archivo de lectura con codificación autodeclarada" que utiliza para leer la fuente del idioma?) De lo contrario, ¿cuál es la forma más fácil de lograr el efecto deseado?
Una idea es abrir el archivo usando el open
habitual, leer las dos primeras líneas, interpretarlas como UTF-8, buscar una declaración de codificación usando la expresión regular en el PEP, y si se encuentra una decodificación de inicio todos los siguientes líneas usando la codificación declarada. Para que esto funcione, necesitamos saber que para todas las codificaciones que Python permite en el código fuente de Python, el Python readline
normal dividirá el archivo en líneas, es decir, necesitamos saber que para todas las codificaciones Python lo permite en la fuente de Python, la cadena de bytes '\ n' siempre significa realmente nueva línea, y no es parte de una secuencia de varios bytes que codifica otro carácter. (De hecho, también tengo que preocuparme por '\ r \ n' también). ¿Alguien sabe si esto es cierto? Los documentos no fueron muy específicos.
Otra idea es buscar en las fuentes de Python. ¿Alguien sabe en qué parte de la fuente de Python se realiza el procesamiento de codificación de código fuente?
Parece que Python 3.4 responde a su pregunta - vea mi respuesta. –