Il est impossible de détecter correctement l'encodage à tout moment .
(De la chardet FAQ :)
Cependant, certains encodages sont optimisés pour des langues spécifiques et les langues ne sont pas aléatoires. Certaines séquences de personnages apparaissent tout le temps, tandis que d'autres séquences n'ont aucun sens. Une personne parlant couramment l'anglais qui ouvre un journal et trouve «txzqJv 2! Dasd0a QqdKjvz» reconnaîtra instantanément que ce n'est pas de l'anglais (même s'il est entièrement composé de lettres anglaises). En étudiant beaucoup de texte «typique», un algorithme informatique peut simuler ce type de maîtrise et faire une supposition éclairée sur la langue d'un texte.
Il y a la bibliothèque chardet qui utilise cette étude pour essayer de détecter l'encodage. chardet est un portage du code de détection automatique dans Mozilla.
Vous pouvez également utiliser UnicodeDammit . Il essaiera 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) une balise META http-equiv. Si Beautiful Soup trouve ce type d'encodage dans le document, il analyse à nouveau le document depuis le début et essaie le nouvel encodage. La seule exception est si vous avez explicitement spécifié un encodage, et que l'encodage a réellement fonctionné: alors il ignorera tout encodage qu'il trouve dans le document.
- Un encodage reniflé en regardant les premiers octets du fichier. Si un codage est détecté à ce stade, ce sera l'un des codages UTF- *, EBCDIC ou ASCII.
- Un encodage reniflé par le chardet bibliothèque , si vous l'avez installé.
- UTF-8
- Windows-1252
chardet
référence. Semble bien, bien qu'un peu lent.Une autre option pour travailler sur l'encodage est d'utiliser libmagic (qui est le code derrière la commande file ). Il existe une profusion de liaisons python disponibles.
Les liaisons python présentes dans l'arborescence des sources de fichiers sont disponibles en tant que paquet Debian python-magic (ou python3-magic ). Il peut déterminer l'encodage d'un fichier en faisant:
Il y a un paquet pip python-magic de nom identique, mais incompatible, sur pypi qui utilise également
libmagic
. Il peut également obtenir l'encodage en faisant:la source
libmagic
est en effet une alternative viable àchardet
. Et d'excellentes informations sur les différents packages nomméspython-magic
! Je suis sûr que cette ambiguïté pique beaucoup de mondefile
n'est pas particulièrement bon pour identifier le langage humain dans les fichiers texte. Il est excellent pour identifier différents formats de conteneurs, même si vous devez parfois savoir ce que cela signifie («document Microsoft Office» peut signifier un message Outlook, etc.).open()
:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 169799: invalid start byte
. Le codage du fichier selon vim:set fileencoding
estlatin1
.errors='ignore'
, la sortie de l'exemple de code est la moins utilebinary
.Quelques stratégies d'encodage, veuillez ne pas commenter au goût:
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:
la source
io
, commeio.open(filepath, 'r', encoding='utf-8')
, ce qui est plus pratique, car ilcodecs
ne se convertit pas\n
automatiquement en lecture et en écriture. Plus d'informations ICIVoici un exemple de lecture et de prise à la valeur nominale d'une
chardet
prédiction de codage, lecturen_lines
du fichier dans le cas où il est volumineux.chardet
vous donne également une probabilité (c'est-à-direconfidence
) de sa prédiction de codage (je n'ai pas regardé comment ils en sont arrivés à cela), qui est retournée avec sa prédictionchardet.predict()
, vous pouvez donc travailler cela d'une manière ou d'une autre si vous le souhaitez.la source
def predict_encoding(file_path, n=20): ... skip ... and then rawdata = b''.join([f.read() for _ in range(n)])
J'ai essayé cette fonction sur Python 3.6, fonctionnait parfaitement avec les encodages "ascii", "cp1252", "utf-8", "unicode". C'est donc définitivement un vote positif.la source
En fonction de votre plateforme, je choisis simplement d'utiliser la
file
commande shell linux . Cela fonctionne pour moi car je l'utilise dans un script qui s'exécute exclusivement sur l'une de nos machines Linux.Évidemment, ce n'est pas une solution ou une réponse idéale, mais elle pourrait être modifiée pour répondre à vos besoins. Dans mon cas, je dois juste déterminer si un fichier est UTF-8 ou non.
la source
Cela pourrait être utile
la source
Il est, en principe, impossible de déterminer l'encodage 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.
Si vous avez des connaissances plus spécifiques sur le fichier texte (par exemple qu'il est XML), il peut y avoir des fonctions de bibliothèque.
la source
Si vous connaissez le contenu du fichier, vous pouvez essayer de le décoder avec plusieurs encodages et voir celui qui manque. En général, il n'y a aucun moyen car un fichier texte est un fichier texte et ceux-ci sont stupides;)
la source
Ce site a du code python pour reconnaître l'ascii, l'encodage avec des boms et utf8 no bom: https://unicodebook.readthedocs.io/guess_encoding.html . Lire le fichier dans un tableau d'octets (données): http://www.codecodex.com/wiki/Read_a_file_into_a_byte_array . Voici un exemple. Je suis en osx.
la source