Чтобы лучше понять проблему, я немного изменил ваш код.
...
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
...
if __name__ == "__main__":
# eh = Handler()
eh = LoggingEventHandler()
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
observer = Observer()
...
Замена FileSystemEventHandler
на LoggingEventHandler
в функции main
создаст журнал событий. При изменении текстового файла в каталоге «./file» журналы создаются следующим образом:
2020-04-26 12:41:25 - Created file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files
2020-04-26 12:41:25 - Modified file: ./files/b.txt~
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Deleted file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files
Здесь удаленным файлом является b.txt~
, который является промежуточным файлом, а не вашим исходным файлом. Так что вам просто нужно отфильтровать события промежуточных файлов.
Вот код с исправлением:
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
WATCH_PATH = './files'
class Handler(FileSystemEventHandler):
def on_any_event(self, event):
if str(event.src_path).endswith("~"):
return None
if event.event_type == 'modified':
modified(event.src_path)
elif event.event_type == 'created':
created(event.src_path)
elif event.event_type == 'deleted':
deleted(event.src_path)
def modified(src):
print(src, 'modified')
def created(src):
print(src, 'created')
def deleted(src):
print(src, 'deleted')
if __name__ == "__main__":
eh = Handler()
observer = Observer()
observer.schedule(eh, path=WATCH_PATH, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Stopping the observer...")
observer.stop()
observer.join()
Вывод:
./files modified
./files/b.txt modified
./files modified