316 votes

Python: Y a-t-il un moyen de déterminer l'encodage d'un fichier texte?

Je sais qu'il y a quelque chose de caché ici . Mais je me demandais simplement si Python permettait réellement de déterminer le codage de fichier texte.

Merci de votre aide :)

Edit: En tant que question secondaire, elle peut être ignorée si vous le souhaitez, mais pourquoi le type d’encodage n’est pas mis dans le fichier afin de le détecter plus facilement?

284voto

nosklo Points 75862

Correctement la détection de l'encodage de tous les temps est impossible.

(À partir de chardet FAQ:)

Toutefois, certains encodages sont optimisés pour des langues spécifiques, et des langues ne sont pas aléatoires. Certains de ces caractères les séquences de pop up tout le temps, tout en d'autres séquences n'ont pas de sens. Un personne à l'aise en anglais qui ouvre une journal et trouve "txzqJv 2!dasd0a QqdKjvz" sera instantanément reconnaître que ce n'est pas l'anglais (même si c'est entièrement composé de lettres anglaises). Par l'étude de beaucoup de "typique" du texte, un algorithme d'ordinateur peut simuler cette type de fluidité et de faire de l'éducation de la devinez à propos d'un texte de langue.

Il est le chardet bibliothèque qui utilise cette étude pour tenter de détecter l'encodage. chardet est un port de la détection automatique de code de Mozilla.

Vous pouvez également utiliser UnicodeDammit. Il va essayer les méthodes suivantes:

  • Un encodage découvert dans le document lui-même: par exemple, dans une déclaration XML, ou (pour les documents HTML) http-equiv balise META. Si Belle Soupe de trouver ce genre de codage dans le document, il analyse le document à nouveau depuis le début et donne le nouveau codage de l'essayer. La seule exception est si vous l'avez explicitement spécifié un encodage, et que l'encodage effectivement travaillées: alors qu'il ignore tout de l'encodage qu'il trouve dans le document.
  • Un encodage reniflé en regardant les premiers octets du fichier. Si l'encodage détecté à ce stade, il sera l'un de l'UTF-* encodages, EBCDIC, ou ASCII.
  • Un encodage repérée par le chardet bibliothèque, si vous l'avez installé.
  • UTF-8
  • Windows-1252

99voto

Hamish Downer Points 4086

Une autre option pour l'encodage à utiliser libmagic (qui est le code de l' fichier de commande). Il y a une profusion de liaisons python disponible.

Les bindings python qui vivent dans le fichier source de l'arbre sont disponibles comme python-magie paquet debian. Si peut déterminer l'encodage d'un fichier en faisant:

import magic

blob = open('unknown-file').read()
m = magic.open(magic.MAGIC_MIME_ENCODING)
m.load()
encoding = m.buffer(blob)  # "utf-8" "us-ascii" etc

Il y a un nom identique, mais incompatibles, python-magie pip paquet sur pypi, qui utilise également libmagic. Il peut aussi faire de l'encodage, en faisant:

import magic

blob = open('unknown-file').read()
m = magic.Magic(mime_encoding=True)
encoding = m.from_buffer(blob)

45voto

zzart Points 2162

Quelques stratégies d'encodage, veuillez ne pas commenter au goût:

 #!/bin/bash
#
tmpfile=$1
echo '-- info about file file ........'
file -i $tmpfile
enca -g $tmpfile
echo 'recoding ........'
#iconv -f iso-8859-2 -t utf-8 back_test.xml > $tmpfile
#enca -x utf-8 $tmpfile
#enca -g $tmpfile
recode CP1250..UTF-8 $tmpfile
 

Vous voudrez peut-être vérifier l'encodage en ouvrant et en lisant le fichier sous la forme d'une boucle ... mais vous devrez peut-être d'abord vérifier la taille du fichier:

 encodings = ['utf-8', 'windows-1250', 'windows-1252' ...etc]
            for e in encodings:
                try:
                    fh = codecs.open('file.txt', 'r', encoding=e)
                    fh.readlines()
                    fh.seek(0)
                except UnicodeDecodeError:
                    print('got unicode error with %s , trying different encoding' % e)
                else:
                    print('opening the file with encoding:  %s ' % e)
                    continue              
 

5voto

Martin v. Löwis Points 61768

Il est en principe impossible de déterminer le codage d'un fichier texte, dans le cas général. Donc non, il n'y a pas de bibliothèque Python standard pour le faire pour vous.

Si vous avez des connaissances plus spécifiques sur le fichier texte (par exemple, il s'agit de XML), il pourrait y avoir des fonctions de bibliothèque.

1voto

Martin Thurau Points 3891

Si vous connaissez le contenu du fichier, vous pouvez essayer de le décoder avec plusieurs encodages et voir lequel est manquant. En général, il n'y a aucun moyen, car un fichier texte est un fichier texte et ceux-ci sont stupides;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X