实用python代码-01-监听文件变化
【需求】对电脑硬盘中发生变换的文件实现监听,并记录对应的日志;
【目的】1)知道硬盘又多了那些大文件;2)方便硬盘不足时安心的删除数据;
实现代码
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import datetime
import time
import os
class Watcher:
def __init__(self, directory_to_watch):
self.observer = Observer()
self.directory_to_watch = directory_to_watch
def run(self):
event_handler = Handler()
self.observer.schedule(event_handler, self.directory_to_watch, recursive=True)
self.observer.start()
try:
while True:
time.sleep(5) # 适当调整睡眠时间,以便不过于频繁地轮询
except KeyboardInterrupt:
self.observer.stop()
print("Observer Stopped")
self.observer.join()
class Handler(FileSystemEventHandler):
@staticmethod
def on_modified(self, event):
if not event.is_directory:
print(f"File {event.src_path} has been modified.")
if os.path.getsize(event.src_path) > 50 * 1024 * 1024: # 50MB
print(f"File size is greater than 50MB: {os.path.getsize(event.src_path)} bytes")
@staticmethod
def on_created(event):
if not event.is_directory:
print(f"File created: {event.src_path} at {datetime.datetime.now()}")
@staticmethod
def on_deleted(event):
if not event.is_directory:
print(f"File deleted: {event.src_path} at {datetime.datetime.now()}")
@staticmethod
def on_moved(event):
if not event.is_directory:
print(f"File moved from {event.src_path} to {event.dest_path} at {datetime.datetime.now()}")
# 检查文件名是否改变
if event.src_path != event.dest_path:
print(f"File renamed from {os.path.basename(event.src_path)} to {os.path.basename(event.dest_path)}")
if __name__ == "__main__":
path_to_watch = "D:/"
print(f"Starting to monitor for changes in {path_to_watch}")
w = Watcher(path_to_watch)
w.run()
【解释】
1)class Watcher:就是实现对应监听功能类;
- 初始化方法先实例化对应的Obeserver类和定义对应的属性存储文件夹的路径;
- run方法定义了Watcher具体执行的代码,self.observer.schedule表示调度器(方便对监听到的内容执行相关操作),event_handle是监听到需要执行的任务;
- observer.start()开启任务,observer.stop()关闭任务(手动结束任务);
- 使用while True循环监执行,使程序休眠5s;observer是另外一个线程,所以while True和observer执行是两个不同的线程;
2)class Handler(FileSysstemEventHandler)继承了FileSysstemEventHandler,按照自己的逻辑重写了相关方法;
- on_modified是文件修改时产生对应的监听,通过event.src_path获取对应的文件的路径,并判断文件的大小是否超过50MB;(这一步可以结合其他的来用);对应的日志可以选择打印或持久化;
- on_created是创建文件时产生的监听;
- on_deleted是删除文件时产生的监听;
- on_moved是移动文件时产生的监听;
3)main函数中实例化对应的Watcher类,并调用对应run方法;
开启windows自动执行程序
1)win + r打开“运行”对话框,输入taskschd.msc
2)点击创建基本任务3)然后继续点击创建“基本任务“,输入对应的名称和描述后点击“下一步”
4)创建对应的“触发器”,设置对应的“触发时间”;触发时间就是说多久执行一次,可以更据需求设置想要的触发周期;
5)选择触发器执行的“任务”,这你选择“启动程序”;
6)
6)选择刚才代码的所在位置,可以设置相关参数(笔者暂时不知道怎么设置)
7)点击“完成”即可
8)查看触发器和其他一些操作;