如何監控 Python 檔案的更改?


在開發人員領域,隨時關注檔案更改對於簡化除錯、自動化和 Python 專案中的即時更新至關重要。監控 Python 檔案更改的行為使我們能夠保持同步,並在出現修改時迅速採取行動。在本文中,我們將探討幾種不同的監控 Python 檔案更改的方法,確保不會錯過任何變化。每種方法都配備了獨特的特性,使您能夠在 Python 指令碼中實施高效的監控解決方案。作為 Python 愛好者,我們將引導您逐步瞭解每種方法,提供分步說明,並分享真實的程式碼示例。到文章結束時,您將掌握在 Python 專案中部署強大的檔案監控機制的專業知識。因此,讓我們踏上這段旅程,在面對檔案更改時保持警惕!

瞭解 Python 中的檔案監控

在我們開始使用程式碼示例之前,讓我們理解 Python 中檔案監控的本質。檔案監控需要定期檢查特定檔案的更改,並在檢測到修改時執行相應的操作。此功能對於跟蹤日誌檔案、自動化指令碼或處理即時資料特別有價值。

Watchdog 庫的應用

我們的第一個示例深入探討了檔案監控,利用 Watchdog 庫,該庫以其在觀察檔案事件方面的簡單性和效率而聞名。

示例

import watchdog
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class FileChangeHandler(FileSystemEventHandler):
   def on_modified(self, event):
     if not event.is_directory:
       print(f"File {event.src_path} has been modified!")

def monitor_file_changes(directory, file_extension):
   event_handler = FileChangeHandler()
   observer = Observer()
   observer.schedule(event_handler, path=directory, 
recursive=True)
   observer.start()

   try:
     while True:
       pass
   except KeyboardInterrupt:
     observer.stop()

   observer.join()

在此示例中,我們匯入 Watchdog 庫,構造一個繼承自 FileSystemEventHandler 的 FileChangeHandler 類。on_modified 方法登場,並在檔案發生修改時列印一條訊息。我們繼續定義 monitor_file_changes() 函式,該函式可以輕鬆地接受目錄和副檔名作為引數。事件處理程式做好準備,並建立一個觀察者來監視指定目錄中的更改。recursive=True 選項確保不會忽略子目錄。最後,觀察者開始行動,忠實地保持警惕,直到鍵盤中斷 (Ctrl + C) 發出撤退訊號。

使用 watchdog.events 模組進行精細控制

我們的第二個示例處理檔案監控的過程,直接使用 watchdog.events 模組,允許對檔案事件進行細粒度控制。

示例

import watchdog
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, 
EVENT_TYPE_MODIFIED

class FileChangeHandler(FileSystemEventHandler):
   def on_modified(self, event):
     if not event.is_directory and event.event_type == 
EVENT_TYPE_MODIFIED:
       print(f"File {event.src_path} has been modified!")

def monitor_file_changes(directory, file_extension):
   event_handler = FileChangeHandler()
   observer = Observer()
   observer.schedule(event_handler, path=directory, 
recursive=True)
   observer.start()

   try:
     while True:
       pass
   except KeyboardInterrupt:
     observer.stop()

   observer.join()

在這種情況下,我們呼叫 FileSystemEventHandler 類,仔細檢查事件型別以檢測 EVENT_TYPE_MODIFIED,預示著檔案修改的存在。這種方法在處理各種檔案事件時賦予我們更精細的控制。其餘程式碼保留了其前一個示例中的本質。

採用輪詢方法

我們的下一個程式碼示例深入探討了檔案監控,部署了輪詢方法,其中我們定期檢查檔案更改。

示例

import time
import os

def monitor_file_changes(directory, file_extension):
   file_paths = [os.path.join(directory, file) for file in os.listdir(directory) if file.endswith(file_extension)]

   while True:
     for file_path in file_paths:
       current_timestamp = os.path.getmtime(file_path)
       if file_path in monitored_files and 
monitored_files[file_path] != current_timestamp:
         print(f"File {file_path} has been modified!")
         monitored_files[file_path] = current_timestamp

     time.sleep(1)

在此程式碼段中,我們開始使用輪詢方法來監控檔案更改。monitor_file_changes() 函式接受目錄和副檔名作為引數。建立一個與指定副檔名匹配的檔案路徑列表,然後進入迴圈,定期檢查每個檔案的修改時間戳。在檢測到檔案時間戳發生變化後,我們將傳送一條訊息,宣佈檔案已修改。

揭示 inotify 庫(僅限 Linux)

我們的最後一個示例展示了檔案監控,其中我們部署了 inotify 庫;它僅在 Linux 系統上可用。

示例

import inotify.adapters

def monitor_file_changes(directory, file_extension):
   i = inotify.adapters.Inotify()

   i.add_watch(directory)

   for event in i.event_gen():
     if event is not None:
       (header, type_names, path, filename) = event
       if file_extension in filename:
         print(f"File {filename} has been modified!")

在此最後一個示例中,我們使用了 inotify 庫,密切關注檔案更改。monitor_file_changes() 函式以目錄和副檔名作為引數。一個 Inotify 例項出現,監視指定的目錄,時刻警惕著變化的跡象。我們繼續遍歷迴圈,注意事件,並在遇到具有指定副檔名的檔案發生修改時,傳送一條訊息,宣佈檔案已更改。

監控 Python 檔案的更改提供了一種強大的功能,它可以確保您在專案中瞭解關鍵檔案更改。無論您是喜歡 Watchdog 庫、輪詢方法的舒適擁抱,還是 inotify(僅限 Linux)的特定於平臺的功能,每種方法都提供了其獨特的優勢,以滿足您的特定監控需求。

隨著您 Python 之旅的繼續,您將磨練檔案監控的技能,確保 Python 專案中的即時更新和有效除錯。願面對檔案更改時保持警惕的力量使您的 Python 指令碼富有成效,併為您的開發工作帶來更高的效率。

更新於:2023年8月3日

1K+ 閱讀量

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告
© . All rights reserved.