Эффективный мониторинг файлов в Python: подробное руководство с примерами кода

Мониторинг файлов — важнейший аспект многих приложений и систем, позволяющий разработчикам обнаруживать изменения, обновления или события, связанные с файлами. В Python существует несколько методов эффективного мониторинга файлов и реагирования на события файловой системы. В этой статье мы рассмотрим различные методы и приведем примеры кода, демонстрирующие их использование.

Метод 1: опрос файлов
Опрос включает в себя периодическую проверку изменений файла путем сравнения его атрибутов, таких как время изменения или размер. Хотя это простой подход, он, возможно, не самый эффективный для мониторинга в реальном времени. Вот пример:

import os
import time
def poll_files(directory):
    file_dict = {}

    while True:
        for filename in os.listdir(directory):
            file_path = os.path.join(directory, filename)

            if os.path.isfile(file_path):
                last_modified = os.path.getmtime(file_path)

                if file_path not in file_dict:
                    file_dict[file_path] = last_modified
                    continue

                if file_dict[file_path] != last_modified:
                    print(f"{file_path} has been modified!")
                    file_dict[file_path] = last_modified

        time.sleep(1)  # Polling interval in seconds
# Usage
directory_to_monitor = "/path/to/directory"
poll_files(directory_to_monitor)

Метод 2: использование библиотеки Watchdog
Watchdog — это популярная библиотека Python, предоставляющая высокоуровневый интерфейс для мониторинга файловой системы. Он использует механизмы, специфичные для операционной системы, для эффективного обнаружения файловых событий. Установите Watchdog с помощью pip install watchdog. Вот пример:

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class FileHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if not event.is_directory:
            print(f"{event.src_path} has been modified!")
# Usage
directory_to_monitor = "/path/to/directory"
event_handler = FileHandler()
observer = Observer()
observer.schedule(event_handler, directory_to_monitor, recursive=True)
observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()

Метод 3: мониторинг на основе Inotify (только для Linux)
В системах Linux вы можете использовать API-интерфейс inotify для эффективного мониторинга файлов. Библиотека pyinotifyпредоставляет Pythonic-интерфейс для inotify. Установите его с помощью pip install pyinotify. Вот пример:

import pyinotify
class EventHandler(pyinotify.ProcessEvent):
    def process_IN_MODIFY(self, event):
        print(f"{event.pathname} has been modified!")
# Usage
directory_to_monitor = "/path/to/directory"
wm = pyinotify.WatchManager()
mask = pyinotify.IN_MODIFY
event_handler = EventHandler()
notifier = pyinotify.Notifier(wm, event_handler)
wdd = wm.add_watch(directory_to_monitor, mask, rec=True)
notifier.loop()

В этой статье мы рассмотрели различные методы мониторинга файлов в Python. Мы обсудили файлы опроса, использование библиотеки Watchdog и мониторинг на основе inotify в системах Linux. Каждый метод имеет свои преимущества и пригодность в зависимости от конкретных требований. Выбрав правильный подход, вы сможете эффективно обнаруживать изменения файлов и события в ваших приложениях Python.