如何监视文件变化?
我有一个日志文件,它是由另一个程序写的,我想监控这个文件的变化。每当文件有变化时,我想读取新数据来进行一些处理。
有什么好的方法可以做到这一点吗?我希望能找到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...