最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中WatchDog的使用經驗總結

 更新時間:2023年12月19日 09:07:32   作者:天元浪子  
在?python?中文件監(jiān)視主要有兩個庫,一個是?pyinotify,一個是?watchdog,本文主要為大家詳細介紹一下Python中WatchDog的使用相關經驗,感興趣的小伙伴可以了解下

概述

首先聲明,本文討論的 watchdog,不是單片機里的 watchdog,也不是 linux 中的 watchdog,而是 python 世界里用來監(jiān)視文件系統(tǒng)變化的一個第三方模塊。在 python 中文件監(jiān)視主要有兩個庫,一個是 pyinotify,一個是 watchdog。pyinotify 依賴于 linux 平臺的 inotify 機制,只能應用在 linux 平臺上。watchdog 則對不同平臺的的事件都進行了封裝,不僅可以監(jiān)視 windows 文件系統(tǒng),也可以監(jiān)視 linux 的文件系統(tǒng)。

文件系統(tǒng)事件類

文件系統(tǒng)事件基類定義如下:

watchdog.events.FileSystemEvent(event_type, src_path, is_directory=False)  
# event.event_type        - 事件類型,為 moved / deleted / created / modified 其中之一
# event.src_path        - 觸發(fā)該事件的文件或目錄路徑
# event.is_directory    - 該事件是否由一個目錄觸發(fā)

由 watchdog.events.FileSystemEvent 基類派生的子類如下:

watchdog.events.FileDeletedEvent() 
# 文件被刪除時觸發(fā)該事件

watchdog.events.DirDeletedEvent() 
# 目錄被刪除時觸發(fā)該事件

watchdog.events.FileCreatedEvent() 
# 文件被創(chuàng)建時觸發(fā)該事件

watchdog.events.DirCreatedEvent() 
# 目錄被創(chuàng)建時觸發(fā)該事件

watchdog.events.FileModifiedEvent() 
# 文件被修改時觸發(fā)該事件(修改文件內容、修改文件inode信息如權限和訪問時間,都會觸發(fā)該事件)

watchdog.events.DirModifiedEvent() 
# 目錄被修改時觸發(fā)該事件

watchdog.events.FileMovedEvent() 
# 文件被移動或重命名時觸發(fā)該事件,因為涉及文件移動,所以除了event.src_path表示原路徑,還有event.dest_path表示目的路徑

watchdog.events.DirMovedEvent() 
# 目錄被移動或重命名時觸發(fā)該事件,因為涉及文件移動,所以除了event.src_path表示原路徑,還有event.dest_path表示目的路徑

文件系統(tǒng)事件處理類

watchdog.events.FileSystemEventHandler 是事件處理器的基類,用于處理事件,用戶需繼承該類,并在子類中重寫對應方法。需要用戶重寫的方法有:

self.on_any_event(event)
# 任何事件發(fā)生都會首先執(zhí)行該方法,該方法默認為空,dispatch()方法會先執(zhí)行該方法,然后再把 event 分派給其他方法處理

self.on_moved(event)
# 處理 DirMovedEvent 和 FileMovedEvent 事件,默認為空

self.on_created(event)
# 處理 DirCreatedEvent 和 FileCreatedEvent 事件,默認為空

self.on_deleted(event)
# 處理 DirDeletedEvent 和 FileDeletedEvent 事件,默認為空

self.on_modified(event)
# 處理 DirModifiedEvent 和 FileModifiedEvent 事件,默認為空

以上方法中,event 有幾個屬性可用:

  • event.is_directory - 觸發(fā)事件的是否為文件夾
  • event.src_path - 源路徑
  • event.dest_path - 目標路徑

最簡單的應用示例

下面的例子展示了如何監(jiān)視 D:\XufiveGit\PEC\client 文件夾內所有文件的 moved / deleted / created / modified。請注意,重命名被視為 moved (移動)。

#-*- coding: utf-8 -*-

from watchdog.observers import Observer
from watchdog.events import *

class FileEventHandler(FileSystemEventHandler):
    def on_any_event(self, event):
        pass
    
    def on_moved(self, event):
        if event.is_directory:
            print("directory moved from {0} to {1}".format(event.src_path,event.dest_path))
        else:
            print("file moved from {0} to {1}".format(event.src_path,event.dest_path))

    def on_created(self, event):
        if event.is_directory:
            print("directory created:{0}".format(event.src_path))
        else:
            print("file created:{0}".format(event.src_path))

    def on_deleted(self, event):
        if event.is_directory:
            print("directory deleted:{0}".format(event.src_path))
        else:
            print("file deleted:{0}".format(event.src_path))
    
    def on_modified(self, event):
        if event.is_directory:
            print("directory modified:{0}".format(event.src_path))
        else:
            print("file modified:{0}".format(event.src_path))        
    
if __name__ == "__main__":
    import time
    
    observer = Observer()
    event_handler = FileEventHandler()
    observer.schedule(event_handler, r"D:\XufiveGit\PEC\client", True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

存在的問題

真正測試過之后,你會發(fā)現,上面的例子幾乎沒有實用價值,因為,文件操作引發(fā)的事件比我們想象的多了不少,而且難以在事件函數中做出針對性處理。比如,添加一個文件,勢必引發(fā) created 事件,同時也會導致所在文件夾的 modified 事件,如果該文件目錄比較深,還會引發(fā)多層父級文件夾的 modified 事件。

如果,你覺得這不算什么問題,那么,在 windows 平臺上每一次的文件修改引發(fā)兩次 modified 事件,算不算一個令人頭疼的問題呢?在 linux 平臺上表現如何,我沒有測試過,但在 windows 平臺上,由于 watchdog 封裝的是 windows 系統(tǒng)的 FileSystemWatcher Events,處理文件的過程中執(zhí)行了多次文件系統(tǒng)操作,無法避免地觸發(fā)了多次事件。

改進方案

如果對監(jiān)視文件的實時性要求不高,又懶得處理一大堆事件,那么,比較事件前后的文件夾快照就是一個值得嘗試的改進方案。實現這個思路,有三個前提條件:

  • 快速獲取文件夾快照。幸運的是,watchdog 模塊為我們提供了 DirectorySnapshot 功能
  • 可以接受200毫秒的延時。文件操作引發(fā)的一大堆事件會集中在一個較短的時間內,一般情況下,在文件操作之后200毫秒獲取文件夾快照,是一個不錯的間隔
  • 快速比較文件夾快照。這也不是問題,watchdog 模塊有 DirectorySnapshotDiff 子模塊

改進思路是這樣的:設置一個定時器, 200毫秒后抓取快照,并與上一張快照比較。每當有事件發(fā)生時,檢查定時器是否已經啟動。如果未啟動,則直接啟動定時器;否則,說明該事件距離上次事件不足200毫秒,可視為是同一組事件,此時終止定時器,再次重啟。具體代碼如下:

#-*- coding: utf-8 -*-

import os, threading
from watchdog.observers import Observer
from watchdog.events import *
from watchdog.utils.dirsnapshot import DirectorySnapshot, DirectorySnapshotDiff

class FileEventHandler(FileSystemEventHandler):
    def __init__(self, aim_path):
        FileSystemEventHandler.__init__(self)
        self.aim_path = aim_path
        self.timer = None
        self.snapshot = DirectorySnapshot(self.core.proj_path)
    
    def on_any_event(self, event):
        if self.timer:
            self.timer.cancel()
        
        self.timer = threading.Timer(0.2, self.checkSnapshot)
        self.timer.start()
    
    def checkSnapshot(self):
        snapshot = DirectorySnapshot(self.aim_path)
        diff = DirectorySnapshotDiff(self.snapshot, snapshot)
        self.snapshot = snapshot
        self.timer = None
        
        print("files_created:", diff.files_created)
        print("files_deleted:", diff.files_deleted)
        print("files_modified:", diff.files_modified)
        print("files_moved:", diff.files_moved)
        print("dirs_modified:", diff.dirs_modified)
        print("dirs_moved:", diff.dirs_moved)
        print("dirs_deleted:", diff.dirs_deleted)
        print("dirs_created:", diff.dirs_created)
		
		# 接下來就是你想干的啥就干點啥,或者該干點啥就干點啥
		pass
    
class DirMonitor(object):
    """文件夾監(jiān)視類"""
    
    def __init__(self, aim_path):
        """構造函數"""
        
        self.aim_path= aim_path
        self.observer = Observer()
    
    def start(self):
        """啟動"""
        
        event_handler = FileEventHandler(self.aim_path)
        self.observer.schedule(event_handler, self.aim_path, True)
        self.observer.start()
    
    def stop(self):
        """停止"""
        
        self.observer.stop()
    
if __name__ == "__main__":
    monitor = DirMonitor(r"D:\XufiveGit\PEC\client")
    monitor.start()

到此這篇關于Python中WatchDog的使用經驗總結的文章就介紹到這了,更多相關Python WatchDog內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python中字符串比較使用is、==和cmp()總結

    python中字符串比較使用is、==和cmp()總結

    在Python中比較字符串最好是使用簡單邏輯操作符,今天為大家講解一下is、==和cmp()使用總結
    2018-03-03
  • Python繪制散點圖的教程詳解

    Python繪制散點圖的教程詳解

    散點圖是指在回歸分析中,數據點在直角坐標系平面上的分布圖,散點圖表示因變量隨自變量而變化的大致趨勢,據此可以選擇合適的函數對數據點進行擬合。本文將用Python繪制散點圖,需要的可以參考一下
    2022-03-03
  • 利用PyTorch實現VGG16教程

    利用PyTorch實現VGG16教程

    這篇文章主要介紹了利用PyTorch實現VGG16教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python3.x版本中新的字符串格式化方法

    Python3.x版本中新的字符串格式化方法

    這篇文章主要介紹了Python3.x版本中新的字符串格式化方法,本文對比給出了Python2.x和Python3.x中字符串格式化方法實例代碼,需要的朋友可以參考下
    2015-04-04
  • Python使用PyQt開發(fā)一個桌面計算器的實戰(zhàn)指南

    Python使用PyQt開發(fā)一個桌面計算器的實戰(zhàn)指南

    在桌面應用開發(fā)中,計算器 是一個非常適合入門的練手項目, 它涉及到圖形界面設計、事件綁定、信號槽機制、布局管理等核心概念,今天我們將使用 PyQt5一步步實現一個可用的計算器程序,需要的朋友可以參考下
    2025-11-11
  • 對Python定時任務的啟動和停止方法詳解

    對Python定時任務的啟動和停止方法詳解

    今天小編就為大家分享一篇對Python定時任務的啟動和停止方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • PyQt4編程之讓狀態(tài)欄顯示信息的方法

    PyQt4編程之讓狀態(tài)欄顯示信息的方法

    今天小編就為大家分享一篇PyQt4編程之讓狀態(tài)欄顯示信息的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python實現讀取SQLServer數據并插入到MongoDB數據庫的方法示例

    Python實現讀取SQLServer數據并插入到MongoDB數據庫的方法示例

    這篇文章主要介紹了Python實現讀取SQLServer數據并插入到MongoDB數據庫的方法,涉及Python同時進行SQLServer與MongoDB數據庫的連接、查詢、讀取、寫入等相關操作實現技巧,需要的朋友可以參考下
    2018-06-06
  • Python數據分析之matplotlib繪圖詳解

    Python數據分析之matplotlib繪圖詳解

    這篇文章主要為大家詳細介紹了Python數據分析之如何利用matplotlib進行繪圖,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-09-09
  • Python找出9個連續(xù)的空閑端口

    Python找出9個連續(xù)的空閑端口

    這篇文章主要介紹了Python找出9個連續(xù)的空閑端口的方法,感興趣的小伙伴們可以參考一下
    2016-02-02

最新評論

仙居县| 宝兴县| 天全县| 探索| 柳江县| 基隆市| 革吉县| 满洲里市| 陆丰市| 清涧县| 西峡县| 上犹县| 大名县| 健康| 安达市| 客服| 安多县| 平南县| 上犹县| 潼关县| 伊春市| 开远市| 湖北省| 永春县| 游戏| 乐陵市| 大埔区| 英山县| 杂多县| 汕头市| 大宁县| 刚察县| 资溪县| 桃园市| 儋州市| 抚松县| 叙永县| 浮梁县| 察隅县| 泾川县| 浦东新区|