TransWikia.com

Каким образом можно отследить появление нового файла в директории? Python

Stack Overflow на русском Asked by Crazy Theory on November 9, 2020

подскажите, пожалуйста, каким образом я мог бы отследить появляющийся файл в директории, используя операционную систему Windows?
Понятно, что нужно объявить цикл, но неясно, каким образом получить новый файл.
К примеру у меня в директории рядом с файлом .py лежит папка, в которой будут появляться новые файлы, в этой папке уже есть файл d.txt, когда я запущу питоновский скрипт я ожидаю, что в момент, когда я засуну туда еще один файл, например c.txt он его обнаружит, а там в этой зависимости я планирую произвести нужные мне операции.

One Answer

Попробуйте модуль 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 -- это дает возможность настройки фильтрации "из коробки".

Correct answer by gil9red on November 9, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP