Python监听文件变化watchdog
python第三方库watchdog可监听操作系统文件和目录的变化,使用简单方便。
使用方法如下
import datetime
import os.path
from watchdog.events import FileSystemEventHandler, FileSystemEvent, DirCreatedEvent, DirModifiedEvent, DirDeletedEvent
from watchdog.observers import Observer
class MyHandler(FileSystemEventHandler):
def __init__(self):
self._init_time = datetime.datetime.now()
self._map = {}
def dispatch(self, event: FileSystemEvent) -> None:
if event.src_path.endswith('~'):
return
# 忽略所有目录,已经在event_filter中过滤
if event.is_directory:
return
last_change = self._map.get(event.src_path, self._init_time)
# 两次事件大于1秒才处理
if datetime.datetime.now() - last_change > datetime.timedelta(seconds=1):
self._map[event.src_path] = datetime.datetime.now()
return super().dispatch(event)
def on_modified(self, event):
print('modified', event)
def on_created(self, event: FileSystemEvent) -> None:
print('created', event)
def on_deleted(self, event: FileSystemEvent) -> None:
print('deleted', event)
def on_moved(self, event: FileSystemEvent) -> None:
print('moved', event)
if __name__ == '__main__':
observer = Observer()
event_handler = MyHandler()
# 监控当前脚本所在目录下所有文件,忽略所有目录事件
observer.schedule(event_handler, path=os.path.dirname(__file__), recursive=True,
event_filter={DirCreatedEvent, DirModifiedEvent, DirDeletedEvent})
observer.start()
# 阻塞线程
observer.join()
需要注意以下几点
- 监控的path必须是一个路径,否则不生效
- 继承eventhandler定义事件处理
- 一些文件的修改会产生临时文件,如修改word、xlsx等,在Pycharm中修改文件,需要在程序中判断。
- 监控的根目录下文件的变化不会产生根目录事件,根目录的子目录下文件的变化会产生相关的子目录事件。