419 Stimmen

Wie kann ich eine Datei auf Änderungen überwachen?

Ich habe eine Protokolldatei, die von einem anderen Prozess geschrieben wird und die ich auf Änderungen überwachen möchte. Jedes Mal, wenn eine Änderung auftritt, möchte ich die neuen Daten einlesen, um sie zu verarbeiten.

Wie kann man das am besten machen? Ich hatte gehofft, es gäbe eine Art von Haken von der PyWin32-Bibliothek. Ich habe die win32file.FindNextChangeNotification Funktion, weiß aber nicht, wie man sie auffordert, eine bestimmte Datei zu überwachen.

Wenn jemand so etwas schon einmal gemacht hat, wäre ich sehr dankbar zu erfahren, wie...

[Bearbeiten] Ich hätte erwähnen sollen, dass ich eine Lösung gesucht habe, die keine Abfrage erfordert.

[Bearbeiten] Verflucht! Es scheint, dass dies nicht über ein gemapptes Netzlaufwerk funktioniert. Ich vermute, dass Windows die Aktualisierungen der Datei nicht wie bei einem lokalen Laufwerk "mitbekommt".

8voto

AlaXul Punkte 81

Hier ist eine vereinfachte Version des Codes von Kender, die den gleichen Trick zu tun scheint und nicht die gesamte Datei importiert:

# Check file for new data.

import time

f = open(r'c:\temp\test.txt', 'r')

while True:

    line = f.readline()
    if not line:
        time.sleep(1)
        print 'Nothing New'
    else:
        print 'Call Function: ', line

8voto

redestructa Punkte 1164

Die einfachste Lösung für mich ist die Verwendung des Watchdog-Tools watchmedo

De https://pypi.python.org/pypi/watchdog Ich habe jetzt einen Prozess, der die SQL-Dateien in einem Verzeichnis nachschlägt und sie bei Bedarf ausführt.

watchmedo shell-command \
--patterns="*.sql" \
--recursive \
--command='~/Desktop/load_files_into_mysql_database.sh' \
.

7voto

seuvitor Punkte 291

Nun, da Sie Python verwenden, können Sie einfach eine Datei öffnen und Zeilen daraus lesen.

f = open('file.log')

Wenn die gelesene Zeile nicht leer verarbeiten Sie es.

line = f.readline()
if line:
    // Do what you want with the line

Vielleicht vermissen Sie, dass es in Ordnung ist, weiter anzurufen readline am EOF. In diesem Fall wird einfach ein leerer String zurückgegeben. Und wenn etwas an die Protokolldatei angehängt wird, wird das Lesen dort fortgesetzt, wo es aufgehört hat, wie Sie es brauchen.

Wenn Sie nach einer Lösung suchen, die Ereignisse oder eine bestimmte Bibliothek verwendet, geben Sie dies bitte in Ihrer Frage an. Ansonsten halte ich diese Lösung für sehr gut.

4voto

gimel Punkte 78080

Wie Sie sehen können in Der Artikel von Tim Golden , gezeigt von Horst Gutmann WIN32 ist relativ komplex und überwacht Verzeichnisse, nicht eine einzelne Datei.

Ich möchte vorschlagen, dass Sie sich mit folgenden Themen befassen IronPython die ein .NET python Implementierung. Mit IronPython können Sie alle .NET Funktionalität - einschließlich

System.IO.FileSystemWatcher

die einzelne Dateien mit einer einfachen Veranstaltung Schnittstelle.

3voto

Gus Punkte 5515

Anscheinend hat noch niemand etwas gepostet fswatch . Es ist ein plattformübergreifender Dateisystemüberwacher. Installieren Sie es einfach, führen Sie es aus und folgen Sie den Anweisungen.

Ich habe es mit Python und Golang Programmen verwendet und es funktioniert einfach.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X