Каким образом можно отследить появление нового файла в директории? Python
подскажите, пожалуйста, каким образом я мог бы отследить появляющийся файл в директории, используя операционную систему Windows? Понятно, что нужно объявить цикл, но неясно, каким образом получить новый файл. К примеру у меня в директории рядом с файлом .py лежит папка, в которой будут появляться новые файлы, в этой папке уже есть файл d.txt, когда я запущу питоновский скрипт я ожидаю, что в момент, когда я засуну туда еще один файл, например c.txt он его обнаружит, а там в этой зависимости я планирую произвести нужные мне операции.
Ответы (1 шт):
Попробуйте модуль watchdog.
Пример:
import logging
import time
from pathlib import Path
# pip install watchdog
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
path = Path(__file__).resolve().parent
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
PS.
В примере для обработки изменений в папке использовался LoggingEventHandler, а если вам нужен свой обработчик, то нужно его создать, наследую от FileSystemEventHandler и переопределив методы:
def on_moved(self, event)def on_created(self, event)def on_deleted(self, event)def on_modified(self, event)
Пример (немного переделанный LoggingEventHandler):
from watchdog.events import FileSystemEventHandler
class CustomEventHandler(FileSystemEventHandler):
def on_moved(self, event):
super().on_moved(event)
what = 'directory' if event.is_directory else 'file'
print(f"Moved {what}: from {event.src_path} to {event.dest_path}")
def on_created(self, event):
super().on_created(event)
what = 'directory' if event.is_directory else 'file'
print(f"Created {what}: {event.src_path}")
def on_deleted(self, event):
super().on_deleted(event)
what = 'directory' if event.is_directory else 'file'
print(f"Deleted {what}: {event.src_path}")
def on_modified(self, event):
super().on_modified(event)
what = 'directory' if event.is_directory else 'file'
print(f"Modified {what}: {event.src_path}")
Кст, возможно будет более функционально наследоваться от RegexMatchingEventHandler или PatternMatchingEventHandler -- это дает возможность настройки фильтрации "из коробки".