2010-02-26 10 views
6

Estoy lidiando con algunos problemas en algunos archivos sobre la codificación. Recibimos archivos de otra empresa y tenemos que leerlos (los archivos están en formato csv)Abra un archivo en la codificación correcta automáticamente

Extrañamente, los archivos parecen estar codificados en UTF-16. Estoy logrando hacer eso, pero tengo que abrirlos usando el módulo codecs y especificando la codificación, de esta manera.

ENCODING = 'utf-16' 
with codecs.open(test_file, encoding=ENCODING) as csv_file: 
    # Autodetect dialect 
    dialect = csv.Sniffer().sniff(descriptor.read(1024)) 
    descriptor.seek(0) 
    input_file = csv.reader(descriptor, dialect=dialect) 

    for line in input_file: 
     do_funny_things() 

Pero, al igual que yo soy capaz de conseguir el dialecto de una manera más agnóstico, estoy pensando que será muy bueno para tener una forma de abrir automáticamente los archivos con la codificación adecuada, al menos toda la archivos de texto Hay otros programas, como vim, que logran eso.

¿Alguien sabe una manera de hacerlo en Python 2.6?

PD: espero que esto se resolverá en Python 3, ya que todas las cadenas son Unicode ...

+1

Python 3 no resuelve esto; todo lo que hace es agregar los argumentos 'encoding' y' errors' a 'open()'. –

Respuesta

8

chardet puede ayudar.

Codificación de caracteres detección automática en Python 2 y 3. Tan inteligente como su navegador . Fuente abierta.

-4

Si se fijará en Python 3, también debería fijarse con

from __future__ import unicode_literals 
+2

Aparentemente, eso solo significa que tus cadenas son unicode, no que puedes subir unicode directamente desde un archivo ... También es utf-8 – Khelben

5

No va a ser "fijo" en Python 3, ya que no es un problema solucionable. Muchos documentos son válidos en varias codificaciones, por lo que la única forma de determinar la codificación adecuada es conocer algo sobre el documento. Afortunadamente, en la mayoría de los casos, sabemos algo sobre el documento, como por ejemplo, la mayoría de los caracteres se agruparán en distintos bloques Unicode. Un documento en inglés contendrá principalmente caracteres dentro de los primeros 128 puntos de código. Un documento en ruso contendrá principalmente puntos de código cirílicos. La mayoría de los documentos contendrán espacios y líneas nuevas. Estas pistas se pueden usar para ayudarlo a realizar conjeturas sobre qué codificaciones se utilizan. Mejor aún, use una biblioteca escrita por alguien que ya haya hecho el trabajo. (Al igual que chardet, se menciona en otra respuesta por Desintegr.

Cuestiones relacionadas