Abra un archivo en la encoding adecuada automáticamente

Estoy tratando con algunos problemas en algunos archivos sobre la encoding. Recibimos archivos de otra compañía y tenemos que leerlos (los archivos están en formato csv)

Curiosamente, los archivos parecen estar codificados en UTF-16. Estoy logrando hacer eso, pero tengo que abrirlos usando el módulo de codecs y especificando la encoding, 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 soy capaz de obtener el dialecto de una manera más agnóstica, estoy pensando que sería genial tener una forma de abrir automáticamente los archivos con su encoding adecuada, al menos todos los archivos de texto. Hay otros progtwigs, como vim que logran eso.

¿Alguien sabe una forma de hacer eso en Python 2.6?

PD: Espero que esto se resuelva en Python 3, ya que todas las cadenas son Unicode …

Chardet te puede ayudar.

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

No se “solucionará” 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 encoding correcta es saber 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 del documento contendrá espacios y nuevas líneas. Estas pistas pueden usarse para ayudarlo a hacer suposiciones informadas sobre qué codificaciones se están utilizando. Mejor aún, use una biblioteca escrita por alguien que ya haya hecho el trabajo. (Como chardet , mencionado en otra respuesta por Desintegr .

csv.reader no puede manejar cadenas Unicode en 2.x. Consulte la parte inferior de la documentación de csv y esta pregunta para conocer las formas de manejarlo.

Si se solucionará en Python 3, también debe solucionarse utilizando

 from __future__ import unicode_literals