Suchen von Textdateien mit verschiedenen Codierungen mit Python?

Ich habe Probleme mit der variablen Textcodierung beim Öffnen von Textdateien, um eine Übereinstimmung im Inhalt der Dateien zu finden.

Ich schreibe ein Skript, um das Dateisystem für Protokolldateien mit bestimmten Inhalten zu scannen, um sie in ein Archiv zu kopieren. Die Namen werden oft geändert, so dass der Inhalt die einzige Möglichkeit ist, sie zu identifizieren. Ich muss * .txt-Dateien identifizieren und in ihrem Inhalt einen String finden, der für diese speziellen Protokolldateien eindeutig ist.

Ich habe den Code unten, der meistens funktioniert. Das Problem ist, dass die Protokolle ihre Kodierung geändert haben können, wenn sie geöffnet und bearbeitet werden. In diesem Fall wird Python nicht mit dem Suchbegriff in den Inhalt übereinstimmen, da der Inhalt verstümmelt ist, wenn Python die falsche Codierung verwendet, um die Datei zu öffnen.

import os import codecs #Filepaths to search FILEPATH = "SomeDrive:\\SomeDirs\\" #Text to match in file names MATCH_CONDITION = ".txt" #Text to match in file contents MATCH_CONTENT = "--------Base Data Details:--------------------" for root, dirs, files in os.walk(FILEPATH): for f in files: if MATCH_CONDITION in f: print "Searching: " + os.path.join(root,f) #ATTEMPT A - #matches only text file re-encoded as ANSI, #UTF-8, UTF-8 no BOM #search_file = open(os.path.join(root,f), 'r') #ATTEMPT B - #matches text files ouput from Trimble software #"UCS-2 LE w/o BOM", also "UCS-2 Little Endian" - #(same file resaved using Windows Notepad), search_file = codecs.open(os.path.join(root,f), 'r', 'utf_16_le') file_data = search_file.read() if MATCH_CONTENT in file_data: print "CONTENTS MATCHED: " + f search_file.close() 

Ich kann die Dateien in Notepad ++ öffnen, die die Codierung erkennt. Mit dem regulären file.open () Python-Befehl wird die Codierung nicht automatisch erkannt. Ich kann Codecs.open verwenden und die Codierung angeben, um eine einzelne Codierung zu fangen, aber dann muss man überschüssigen Code schreiben, um den Rest zu fangen. Ich habe die Dokumentation des Python-Codecs-Moduls gelesen und es scheint keine automatische Erkennung zu haben.

Welche Optionen muss ich mit jeder Codierung prägnant und robust jede Textdatei durchsuchen?

Ich habe über das Chardet- Modul gelesen, was gut scheint, aber ich muss wirklich vermeiden, Module zu installieren. Jedenfalls muss es einen einfacheren Weg geben, mit der alten und ehrwürdigen Textdatei zu interagieren. Sicherlich als Newb mache ich das zu kompliziert, richtig?

Python 2.7.2, Windows 7 64-Bit. Wahrscheinlich nicht notwendig, aber hier ist eine Beispielprotokolldatei .

EDIT: Soweit ich weiß, die Dateien werden fast sicher in einer der Codierungen in den Code Kommentare: ANSI, UTF-8, UTF_16_LE (als UCS-2 LE ohne Stückliste, UCS-2 Little Endian). Es gibt immer das Potenzial für jemanden, einen Weg um meine Erwartungen zu finden …

EDIT: Während der Verwendung einer externen Bibliothek ist sicherlich die Sound-Ansatz, habe ich eine Chance auf schreiben einige Amateur-Code, um die Kodierung zu erraten und erbeten Feedback in einer anderen Frage -> Fallstricke in meinem Code für die Erkennung von Textdatei-Codierung mit Python?

  • Python-Standardbibliothek zu POST-Multipart- / Form-Daten-codierten Daten
  • Wie kann ich verhindern, dass str Unicode-Zeichen als Hex-Codes kodiert?
  • Speichern von Textdateiinhalten in DB: "Falscher Stringwert: '\ xEF \ xBB \ xBF # W ...' für Spalte 'Inhalt' in Zeile 1"
  • UnicodeEncodeError mit BeautifulSoup 3.1.0.1 und Python 2.5.2
  • Python 3.4 hex zu japanischen Zeichen
  • Wie kostet man durch mehrere Regex-Anweisungen in Python prägnant
  • One Solution collect form web for “Suchen von Textdateien mit verschiedenen Codierungen mit Python?”

    Das chardet Paket existiert aus einem Grund (und wurde aus einem älteren Netscape-Code aus einem ähnlichen Grund portiert): Das Erkennen der Codierung einer beliebigen Textdatei ist schwierig.

    Es gibt zwei grundlegende Alternativen:

    1. Verwenden Sie einige hartcodierte Regeln, um festzustellen, ob eine Datei eine bestimmte Codierung hat. Zum Beispiel könntest du am Anfang der Datei nach der UTF-Byte-Order-Markierung suchen. Dies bricht für Kodierungen, die sich signifikant in ihrer Verwendung von verschiedenen Bytes überschneiden, oder für Dateien, die nicht die "Marker" Bytes verwenden, die Ihre Erkennungsregeln verwenden.

    2. Nehmen Sie eine Datenbank mit Dateien in bekannten Codierungen und zählen Sie die Verteilungen von verschiedenen Bytes (und Bytepaaren, Drillinge etc.) in jeder der Codierungen auf. Dann, wenn Sie eine Datei von unbekannter Codierung haben, nehmen Sie ein Beispiel von seinen Bytes und sehen Sie, welches Muster der Bytegebrauch die beste Übereinstimmung ist. Dies bricht, wenn Sie kurze Testdateien haben (was die Häufigkeitsschätzungen ungenau macht) oder wenn die Verwendung der Bytes in Ihrer Testdatei nicht mit der Verwendung in der Dateidatenbank übereinstimmt, mit der Sie Ihre Frequenzdaten aufgebaut haben.

    Der Grund Notizblock ++ kann Zeichenerkennung (sowie Web-Browser, Textverarbeitungsprogramme, etc.) ist, dass diese Programme alle eine oder beide dieser Methoden in das Programm eingebaut haben. Python baut das nicht in seinen Dolmetscher – es ist eine Allzweck-Programmiersprache, kein Texteditor – aber das ist genau das, was das chardet Paket tut.

    Ich würde sagen, dass, weil Sie einige Dinge über die Textdateien kennen, die Sie behandeln, können Sie in der Lage, ein paar Shortcuts zu nehmen. Zum Beispiel sind Ihre Log-Dateien alle in einer von entweder Codierung A oder Codierung B? Wenn ja, dann ist Ihre Entscheidung viel einfacher, und wahrscheinlich entweder die Frequenz-basierte oder die Regel-basierte Ansatz oben wäre ziemlich einfach zu implementieren auf eigene Faust. Aber wenn du willkürliche Zeichensätze erkennen musst, empfehle ich den Aufbau auf den Schultern der Riesen.

    Python ist die beste Programmiersprache der Welt.