2010-02-26 7 views
6

Je suis face à quelques problèmes dans quelques fichiers sur l'encodage. Nous recevons des fichiers d'autres sociétés et devons les lire (les fichiers sont au format csv)Ouvrir un fichier dans l'encodage approprié automatiquement

Etrangement, les fichiers semblent être codés en UTF-16. Je parviens à le faire, mais je dois les ouvrir en utilisant le module codecs et en spécifiant l'encodage, de cette façon.

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() 

Mais, comme je suis en mesure d'obtenir le dialecte d'une manière plus agnostique, je suis pensant que ce sera génial d'avoir un moyen d'ouvrir automatiquement les fichiers avec son encodage approprié, au moins tous les fichiers texte Il existe d'autres programmes, comme Vim, qui permettent d'atteindre cet objectif.

Quelqu'un sait-il comment faire ça en python 2.6?

PD: J'espère que cela sera résolu en Python 3, comme toutes les chaînes sont Unicode ...

+1

Python 3 ne résout pas ceci, tout ce qu'il fait est d'ajouter les arguments 'encoding' et' errors' à 'open()'. –

Répondre

8

chardet peut vous aider.

encodage des caractères d'auto-détection dans Python 2 et 3. intelligent que votre navigateur . Open source.

-4

S'il sera fixé en Python 3, il devrait également être fixé en utilisant

from __future__ import unicode_literals 
+2

Apparemment, cela signifie seulement que vos chaînes sont unicode, pas que vous pouvez télécharger unicode directement à partir d'un fichier ... c'est utf-8 – Khelben

5

Il ne sera pas « fixe » en python 3, comme ce n'est pas un problème réparable. De nombreux documents sont valides dans plusieurs encodages, la seule façon de déterminer l'encodage approprié est de savoir quelque chose sur le document. Heureusement, dans la plupart des cas, nous savons quelque chose sur le document, comme par exemple, la plupart des caractères seront regroupés en blocs Unicode distincts. Un document en anglais contiendra principalement des caractères dans les 128 premiers points de code. Un document en russe contiendra principalement des points de code cyrilliques. La plupart des documents contiendront des espaces et des retours à la ligne. Ces indices peuvent être utilisés pour vous aider à faire des suppositions éclairées sur les encodages utilisés. Mieux encore, utilisez une bibliothèque écrite par quelqu'un qui a déjà fait le travail. (Comme chardet, mentionné dans une autre réponse par Desintegr.

Questions connexes