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?

  • Importieren von zufälligen Wörtern aus einer Datei ohne Duplikate Python
  • So lesen und organisieren Sie Textdateien geteilt durch Schlüsselwörter
  • Wie spalte ich eine riesige Textdatei in Python
  • Kopieren von einer Textdatei in eine andere mit Python
  • Bearbeiten einer einzelnen Zeile in einer großen Textdatei
  • Öffnen von Textdateien aus einer Liste in einer anderen Textdatei mit python
  • Python: Laden von Wörtern aus Datei in einen Satz
  • Schreiben Sie mehrere Zeilen zu einer Textdatei, indem Sie Eingabe in Python verwenden?
  • 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.