如何监视文件变化?

419 投票
28 回答
451807 浏览
提问于 2025-04-11 09:29

我有一个日志文件,它是由另一个程序写的,我想监控这个文件的变化。每当文件有变化时,我想读取新数据来进行一些处理。

有什么好的方法可以做到这一点吗?我希望能找到PyWin32库中的某种钩子。我发现了win32file.FindNextChangeNotification这个函数,但我不知道怎么用它来监控特定的文件。

如果有人做过类似的事情,我会非常感激能听到你的经验...

[编辑] 我应该提到我想要一个不需要轮询的解决方案。

[编辑] 真糟糕!看起来这个方法在映射的网络驱动器上不起作用。我猜Windows在更新文件时没有像在本地磁盘那样“听到”这些变化。

28 个回答

59

如果你想要一个可以在多个平台上使用的解决方案,可以看看 QFileSystemWatcher。这里有一段示例代码(未经处理):

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)
136

如果轮询(定期检查)对你来说足够好,那我建议你关注一下文件的“修改时间”是否有变化。要读取这个时间,你可以使用下面的代码:

os.stat(filename).st_mtime

(另外要注意,Windows本地的变化事件解决方案并不是在所有情况下都有效,比如在网络驱动器上就不行。)

import os

class Monkey(object):
    def __init__(self):
        self._cached_stamp = 0
        self.filename = '/path/to/file'

    def ook(self):
        stamp = os.stat(self.filename).st_mtime
        if stamp != self._cached_stamp:
            self._cached_stamp = stamp
            # File has changed, so do something...
331

你试过用 Watchdog 吗?

这是一个Python的API库和命令行工具,用来监控文件系统的变化。

轻松监控文件夹变化

  • 支持多种操作系统的API。
  • 一个命令行工具,可以在文件夹发生变化时执行命令。

你可以通过一个简单的例子快速入门,查看 快速入门...

撰写回答