Es ist unmöglich , die Codierung jederzeit korrekt zu erkennen .
(Von chardet FAQ :)
Einige Codierungen sind jedoch für bestimmte Sprachen optimiert, und Sprachen sind nicht zufällig. Einige Zeichenfolgen werden ständig angezeigt, während andere Sequenzen keinen Sinn ergeben. Eine Person, die fließend Englisch spricht und eine Zeitung öffnet und „txzqJv 2! Dasd0a QqdKjvz“ findet, erkennt sofort, dass dies kein Englisch ist (obwohl es ausschließlich aus englischen Buchstaben besteht). Durch das Studieren vieler „typischer“ Texte kann ein Computeralgorithmus diese Art von Sprachkompetenz simulieren und eine fundierte Vermutung über die Sprache eines Textes anstellen.
Es gibt die Chardet- Bibliothek, die diese Studie verwendet, um zu versuchen, die Codierung zu erkennen. chardet ist ein Port des Codes für die automatische Erkennung in Mozilla.
Sie können auch UnicodeDammit verwenden . Es werden die folgenden Methoden ausprobiert:
- Eine im Dokument selbst entdeckte Codierung: zum Beispiel in einer XML-Deklaration oder (für HTML-Dokumente) einem http-äquivalenten META-Tag. Wenn Beautiful Soup diese Art der Codierung im Dokument findet, wird das Dokument von Anfang an erneut analysiert und die neue Codierung ausprobiert. Die einzige Ausnahme ist, wenn Sie explizit eine Codierung angegeben haben und diese Codierung tatsächlich funktioniert hat: Dann werden alle im Dokument gefundenen Codierungen ignoriert.
- Eine Codierung, die durch Betrachten der ersten Bytes der Datei erkannt wurde. Wenn zu diesem Zeitpunkt eine Codierung erkannt wird, handelt es sich um eine der UTF- * Codierungen, EBCDIC oder ASCII.
- Eine Codierung, die von der Chardet- Bibliothek abgerufen wird , sofern Sie sie installiert haben.
- UTF-8
- Windows-1252
chardet
Hinweis. Scheint gut, wenn auch etwas langsam.Eine weitere Möglichkeit für die Arbeit der Codierung aus zu bedienen libmagic (das ist der Code hinter dem ist Datei - Befehl). Es gibt eine Fülle von Python-Bindungen.
Die Python-Bindungen, die im Dateiquellbaum gespeichert sind, sind als Debian- Paket für Python-Magic (oder Python3-Magic ) verfügbar . Es kann die Codierung einer Datei bestimmen, indem es:
Auf pypi gibt es ein identisch benanntes, aber nicht kompatibles Python-Magic- Pip-Paket, das ebenfalls verwendet wird
libmagic
. Es kann auch die Codierung erhalten, indem es Folgendes tut:quelle
libmagic
ist in der Tat eine praktikable Alternative zuchardet
. Und tolle Infos zu den verschiedenen genannten Paketenpython-magic
! Ich bin sicher, diese Mehrdeutigkeit beißt viele Menschenfile
ist nicht besonders gut darin, die menschliche Sprache in Textdateien zu identifizieren. Es eignet sich hervorragend zum Identifizieren verschiedener Containerformate, obwohl Sie manchmal wissen müssen, was es bedeutet ("Microsoft Office-Dokument" kann eine Outlook-Nachricht usw. bedeuten).open()
:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 169799: invalid start byte
. Die Dateicodierung nach vim:set fileencoding
istlatin1
.errors='ignore'
, ist die Ausgabe des Beispielcodes weniger hilfreichbinary
.Einige Kodierungsstrategien, bitte nach Geschmack auskommentieren:
Möglicherweise möchten Sie die Codierung überprüfen, indem Sie die Datei in Form einer Schleife öffnen und lesen. Möglicherweise müssen Sie jedoch zuerst die Dateigröße überprüfen:
quelle
io
wie verwendenio.open(filepath, 'r', encoding='utf-8')
, was bequemer ist, da beim Lesen und Schreibencodecs
nicht\n
automatisch konvertiert wird . Mehr auf HIERHier ist ein Beispiel für das Lesen und Nehmen einer
chardet
Codierungsvorhersage zum Nennwert , wobein_lines
aus der Datei gelesen wird, falls sie groß ist.chardet
gibt Ihnen auch eine Wahrscheinlichkeit (dhconfidence
) für die Codierungsvorhersage (ich habe nicht nachgesehen, wie sie darauf gekommen sind), die mit der Vorhersage von zurückgegeben wirdchardet.predict()
, sodass Sie das irgendwie einarbeiten können, wenn Sie möchten.quelle
def predict_encoding(file_path, n=20): ... skip ... and then rawdata = b''.join([f.read() for _ in range(n)])
Diese Funktion wurde unter Python 3.6 ausprobiert und funktionierte perfekt mit den Codierungen "ascii", "cp1252", "utf-8" und "unicode". Das ist also definitiv positiv.quelle
Abhängig von Ihrer Plattform entscheide ich mich einfach für den Linux-Shell-
file
Befehl. Dies funktioniert bei mir, da ich es in einem Skript verwende, das ausschließlich auf einem unserer Linux-Computer ausgeführt wird.Natürlich ist dies keine ideale Lösung oder Antwort, aber es könnte an Ihre Bedürfnisse angepasst werden. In meinem Fall muss ich nur feststellen, ob eine Datei UTF-8 ist oder nicht.
quelle
Dies könnte hilfreich sein
quelle
Im allgemeinen Fall ist es grundsätzlich unmöglich, die Kodierung einer Textdatei zu bestimmen. Also nein, es gibt keine Standard-Python-Bibliothek, die das für Sie erledigt.
Wenn Sie genauere Kenntnisse über die Textdatei haben (z. B. XML), gibt es möglicherweise Bibliotheksfunktionen.
quelle
Wenn Sie den Inhalt der Datei kennen, können Sie versuchen, sie mit mehreren Codierungen zu dekodieren und festzustellen, welche fehlen. Im Allgemeinen gibt es keine Möglichkeit, da eine Textdatei eine Textdatei ist und diese dumm sind;)
quelle
Diese Site enthält Python-Code zum Erkennen von ASCII, Codieren mit Boms und utf8 no bom: https://unicodebook.readthedocs.io/guess_encoding.html . Datei in Byte-Array (Daten) einlesen : http://www.codecodex.com/wiki/Read_a_file_into_a_byte_array . Hier ist ein Beispiel. Ich bin in osx.
quelle