python使用watchdog實(shí)現(xiàn)文件資源監(jiān)控
Python文件監(jiān)控庫(kù)watchdogs簡(jiǎn)介
隨著Python在各種應(yīng)用領(lǐng)域中的廣泛使用,其生態(tài)環(huán)境也在持續(xù)繁榮,特別是各種第三方庫(kù)的誕生,極大地豐富了開(kāi)發(fā)者的工具箱。在眾多庫(kù)中, watchdog 作為一個(gè)高效的文件系統(tǒng)監(jiān)控庫(kù),對(duì)于實(shí)時(shí)響應(yīng)文件系統(tǒng)的各種事件(如文件創(chuàng)建、修改、刪除等)提供了極大便利。無(wú)論是在需要監(jiān)控項(xiàng)目文件變化以觸發(fā)自動(dòng)化構(gòu)建的開(kāi)發(fā)場(chǎng)景,還是在需要日志記錄、文件備份等運(yùn)維任務(wù)中, watchdog 都能發(fā)揮重要的作用。
文件資源監(jiān)控
安裝:pip install watchdog
watchdog 支持跨平臺(tái)文件資源監(jiān)控,可以檢測(cè)指定文件夾下文件及文件夾變動(dòng),當(dāng)出現(xiàn)不同變動(dòng)(新增、刪除、修改)后,可進(jìn)行相應(yīng)處理。
from time import sleep, strftime from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class FileMonitoring(FileSystemEventHandler): # event.is_directory 判斷是否是目錄操作 def on_modified(self, event): # 文件或文件夾被修改時(shí)觸發(fā)(新增、刪除及修改文件或文件夾都會(huì)被監(jiān)測(cè)為文件夾的修改) tm = strftime("%Y-%m-%d %H:%M:%S") print(f'{tm} 修改文件夾{event.src_path}') def on_created(self, event): # 文件或目錄被創(chuàng)建時(shí)觸發(fā) tm = strftime("%Y-%m-%d %H:%M:%S") if event.is_directory: print(f'{tm} 創(chuàng)建文件夾{event.src_path}') else: print(f'{tm} 創(chuàng)建文件{event.src_path}') def on_deleted(self, event): # 文件或目錄被刪除時(shí)觸發(fā) tm = strftime("%Y-%m-%d %H:%M:%S") if event.is_directory: print(f'{tm} 刪除文件夾{event.src_path}') else: print(f'{tm} 刪除文件{event.src_path}') def on_moved(self, event): # 目錄的創(chuàng)建和刪除操作,被Watchdog視為移動(dòng)操作,因此通過(guò)on_moved方法進(jìn)行捕捉,重命名也可用此捕獲。 tm = strftime("%Y-%m-%d %H:%M:%S") if event.is_directory: print(f'{tm} 重命名文件夾:文件夾{event.src_path} 重命名為 {event.dest_path}') else: print(f'{tm} 重命名文件:文件{event.src_path} 重命名為 {event.dest_path}') class MyFileMonitor(): def __init__(self): self.event_handler = FileMonitoring() # 初始化事件處理器實(shí)例 def sever(self, watched_dir, recursive: bool = True): ''' :param watched_dir: .schedule 方法設(shè)置要監(jiān)控的目錄路徑和事件處理器 :param recursive: recursive=True 參數(shù)以遞歸地監(jiān)控目錄內(nèi)的所有子目錄 :return: ''' self.observer = Observer() # 初始化觀察器 self.observer.schedule(self.event_handler, watched_dir, recursive=recursive) # 將事件處理器關(guān)聯(lián)到觀察器 return self.observer def run(self, watched_dir, recursive: bool = True): ''' 啟動(dòng)觀察器并進(jìn)入無(wú)限循環(huán),直到用戶(hù)按下 Ctrl+C 中斷程序, observer.stop() 和 observer.join() 來(lái)正確停止和清理觀察器資源。 ''' observer = self.sever(watched_dir, recursive) observer.start() try: while True: sleep(.1) except KeyboardInterrupt: observer.stop() observer.join()
監(jiān)測(cè)文件夾新增、刪除、修改文件夾
在Python中,watchdog
庫(kù)確實(shí)提供了方便的方式來(lái)監(jiān)控文件夾及其內(nèi)部文件的新增、刪除、修改以及重命名等事件。下面是一個(gè)簡(jiǎn)單的示例,展示如何使用 watchdog
來(lái)監(jiān)聽(tīng)一個(gè)文件夾中的這些事件
import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # 定義事件處理器類(lèi) class MyHandler(FileSystemEventHandler): def on_modified(self, event): print(f'File modified: {event.src_path}') def on_created(self, event): print(f'File created: {event.src_path}') def on_deleted(self, event): print(f'File deleted: {event.src_path}') # 對(duì)于文件夾的創(chuàng)建、刪除操作,請(qǐng)注意: # 目錄級(jí)別的事件可通過(guò)on_moved方法捕獲,因?yàn)閯?chuàng)建和刪除目錄也表現(xiàn)為移動(dòng)事件 def on_moved(self, event): if event.is_directory: what = "Directory" else: what = "File" print(f'{what} moved: {event.src_path} to {event.dest_path}') # 初始化事件處理器實(shí)例 event_handler = MyHandler() # 指定要監(jiān)控的文件夾路徑 watched_dir = '/path/to/watch' # 初始化觀察器 observer = Observer() # 將事件處理器關(guān)聯(lián)到觀察器 observer.schedule(event_handler, watched_dir, recursive=True) # 啟動(dòng)觀察器 observer.start() print(f'Starting to watch {watched_dir} for file system events...') try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()
在這個(gè)例子中,MyHandler 類(lèi)繼承了 FileSystemEventHandler 并實(shí)現(xiàn)了幾個(gè)方法來(lái)處理不同的文件系統(tǒng)事件。on_modified 方法會(huì)在文件被修改時(shí)觸發(fā),on_created 在文件或目錄被創(chuàng)建時(shí)觸發(fā),而 on_deleted 在文件或目錄被刪除時(shí)觸發(fā)。對(duì)于目錄的創(chuàng)建和刪除操作,由于Watchdog將它們視為移動(dòng)操作,因此通過(guò) on_moved 方法進(jìn)行捕捉,并檢查 event.is_directory 屬性以區(qū)分是文件還是目錄。
通過(guò) observer.schedule 方法設(shè)置要監(jiān)控的目錄路徑和事件處理器,并設(shè)置 recursive=True 參數(shù)以遞歸地監(jiān)控目錄內(nèi)的所有子目錄。
最后啟動(dòng)觀察器并進(jìn)入無(wú)限循環(huán),直到用戶(hù)按下 Ctrl+C 中斷程序,此時(shí)會(huì)調(diào)用 observer.stop() 和 observer.join() 來(lái)正確停止和清理觀察器資源。
到此這篇關(guān)于python使用watchdog實(shí)現(xiàn)文件資源監(jiān)控的文章就介紹到這了,更多相關(guān)python watchdog文件資源監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式
這篇文章主要介紹了python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07pytorch實(shí)現(xiàn)線性回歸以及多元回歸
這篇文章主要為大家詳細(xì)介紹了pytorch實(shí)現(xiàn)線性回歸以及多元回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Python中使用PyExecJS庫(kù)執(zhí)行JavaScript函數(shù)
Python在運(yùn)行JavaScript函數(shù)時(shí),需要用到外部庫(kù)來(lái)執(zhí)行JavaScript,本文主要介紹了Python中使用PyExecJS庫(kù)執(zhí)行JavaScript函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04python實(shí)現(xiàn)選取或刪除指定列包含指定內(nèi)容的行
這篇文章主要介紹了python實(shí)現(xiàn)選取或刪除指定列包含指定內(nèi)容的行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Python無(wú)權(quán)點(diǎn)文件轉(zhuǎn)化成鄰接矩陣方式
這篇文章主要介紹了Python無(wú)權(quán)點(diǎn)文件轉(zhuǎn)化成鄰接矩陣方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12pytest進(jìn)階教程之fixture函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于pytest進(jìn)階教程之fixture函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03python list語(yǔ)法學(xué)習(xí)(帶例子)
python list語(yǔ)法學(xué)習(xí)2013-11-11