402 votes

Comment regarder un fichier pour les changements en utilisant Python?

J'ai un fichier journal, écrit par un autre processus qui je veux regarder pour les changements. Chaque fois qu'un changement atteint son apogée j'aimerais lire les nouvelles données effectuer un traitement sur elle.

Quelle est la meilleure façon de le faire? J'espérais qu'il y aurait une sorte de crochet de la PyWin32 de la bibliothèque. J'ai trouvé l' win32file.FindNextChangeNotification de la fonction, mais n'ont aucune idée de comment lui demander de regarder un fichier spécifique.

Si quelqu'un a fait quelque chose comme cela, je serais vraiment reconnaissant d'entendre comment...

[Edit] je devrais avoir mentionné que j'étais à la recherche d'une solution qui ne nécessite pas de vote.

[Modifier] Les Malédictions! Il semble que cela ne fonctionne pas sur un lecteur réseau mappé. Je devine que windows n'est pas "entendre" toutes les mises à jour du fichier de la façon dont il le fait sur un disque local.

321voto

simao Points 2906

Avez-vous essayé d'utiliser Watchdog? http://packages.python.org/watchdog/

129voto

Deestan Points 7298

Si l'interrogation est assez bonne pour vous, je ferais juste attention à ce que la statistique du fichier "temps modifié" change. Pour le lire:

 os.stat(filename).st_mtime
 

(Notez également que la solution d'événement de modification native de Windows ne fonctionne pas dans tous les cas, par exemple sur les lecteurs réseau.)

81voto

Horst Gutmann Points 3643

Avez-vous déjà regardé la documentation disponible sur http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html? Si vous avez seulement besoin qu'il fonctionne sous Windows le 2ème exemple semble être exactement ce que vous voulez (si vous remplacez le chemin d'accès du répertoire avec celui du fichier que vous souhaitez regarder).

Sinon, les bureaux de vote sera probablement la seule vraiment indépendant de la plate-option.

Note: je n'ai pas essayé l'une de ces solutions.

57voto

hipersayan_x Points 171

Si vous voulez une solution multiplateforme, vérifiez QFileSystemWatcher . Voici un exemple de code (non aseptisé):

 from PyQt4 import QtCore

@QtCore.pyqtSlot(str)
def directory_changed(path):
    print('Directory Changed!!!')

@QtCore.pyqtSlot(str)
def file_changed(path):
    print('File Changed!!!')

fs_watcher = QtCore.QFileSystemWatcher(['/path/to/files_1', '/path/to/files_2', '/path/to/files_3'])

fs_watcher.connect(fs_watcher, QtCore.SIGNAL('directoryChanged(QString)'), directory_changed)
fs_watcher.connect(fs_watcher, QtCore.SIGNAL('fileChanged(QString)'), file_changed)
 

33voto

Maxime Points 800

Il ne devrait pas fonctionner sur windows (peut-être avec cygwin?), Mais pour l'utilisateur unix, vous devriez utiliser l'appel système "fcntl". Voici un exemple en Python. C'est surtout le même code si vous avez besoin de l'écrire en C (mêmes noms de fonctions)

 import time
import fcntl
import os
import signal

FNAME = "/HOME/TOTO/FILETOWATCH"

def handler(signum, frame):
    print "File %s modified" % (FNAME,)

signal.signal(signal.SIGIO, handler)
fd = os.open(FNAME,  os.O_RDONLY)
fcntl.fcntl(fd, fcntl.F_SETSIG, 0)
fcntl.fcntl(fd, fcntl.F_NOTIFY,
            fcntl.DN_MODIFY | fcntl.DN_CREATE | fcntl.DN_MULTISHOT)

while True:
    time.sleep(10000)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X