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

Python使用watchfiles實(shí)現(xiàn)監(jiān)控目錄變更

 更新時(shí)間:2023年09月15日 09:30:26   作者:古明地覺(jué)的編程教室  
在工作中難免會(huì)碰到這樣的需求,監(jiān)控指定目錄,下面小編就來(lái)和大家介紹一下如何利用watchfiles 模塊實(shí)現(xiàn)監(jiān)控目錄的變更,感興趣的可以了解下

在工作中難免會(huì)碰到這樣的需求,監(jiān)控指定目錄,如果該目錄下發(fā)生文件變更,那么進(jìn)行一系列的處理。而如何監(jiān)視一個(gè)目錄,就是我們本次探討的主題。

監(jiān)視目錄我們可以使用 watchfiles 模塊,該模塊不僅簡(jiǎn)單,而且性能也不錯(cuò)。主要原因是,和底層文件系統(tǒng)交互的代碼是基于 Rust 編寫(xiě)的,所以性能是有保證的。

通過(guò) pip install watchfiles 安裝之后,我們來(lái)看看它的用法。

from?watchfiles?import?watch
#?當(dāng)前目錄為?/Users/satori/Desktop/project
for?change?in?watch("."):
????print(change)

我們執(zhí)行此程序,會(huì)處于阻塞狀態(tài),并持續(xù)監(jiān)聽(tīng)指定目錄的變化。然后我們?cè)诋?dāng)前目錄創(chuàng)建幾個(gè)文件,看看效果。

創(chuàng)建一個(gè) data.txt 文本文件,程序輸出如下:

{(<Change.added: 1>, '/Users/satori/Desktop/project/data.txt')}

返回的是一個(gè)集合,目前只涉及一個(gè)文件的變更,所以集合里面只有一個(gè)元素。而集合里面存儲(chǔ)的都是元組,元組的第一個(gè)元素表示操作類(lèi)型,總共有三種:分別是增加、修改和刪除。

元組的第二個(gè)參數(shù)就是具體的文件路徑,因此程序的輸出就告訴我們,當(dāng)前目錄新增了一個(gè) data.txt。

再創(chuàng)建一個(gè) txt_files 目錄,程序輸出如下:

{(<Change.added: 1>, '/Users/satori/Desktop/project/txt_files')}

不管是目錄文件還是文本文件,都屬于文件,所以輸出是一樣的。如果想知道新增的到底是目錄還是普通文件,那么還需要通過(guò) os 模塊檢測(cè)一下。

我們?cè)?txt_files 目錄中創(chuàng)建一個(gè) data.txt,程序輸出如下:

{(<Change.added: 1>, '/Users/satori/Desktop/project/txt_files/data.txt')}

所以 watch 函數(shù)監(jiān)聽(tīng)的不僅是指定目錄,其內(nèi)部的遞歸子目錄也會(huì)一并監(jiān)聽(tīng)。

問(wèn)題來(lái)了,當(dāng)前目錄下存在一個(gè) data.txt 文件和一個(gè) txt_files 目錄,而 txt_files 目錄也存在一個(gè) data.txt。那么如果將當(dāng)前目錄的 data.txt 移動(dòng)到 txt_files 中,并同意覆蓋,那么程序會(huì)輸出什么呢?

{(<Change.deleted: 3>, '/Users/satori/Desktop/project/txt_files/data.txt'), 
 (<Change.added: 1>, '/Users/satori/Desktop/project/txt_files/data.txt'), 
 (<Change.deleted: 3>, '/Users/satori/Desktop/project/data.txt')}

此時(shí)輸出的集合包含三個(gè)元組,因此該過(guò)程涉及到三次文件的變更。因?yàn)?txt_files 里面的文件被替換掉了,所以相當(dāng)于先被刪除、然后重新創(chuàng)建。而當(dāng)前目錄中的 data.txt 被移走了,因此相當(dāng)于被刪除了。

然后我們?cè)偻ㄟ^(guò) mkdir -p a/b/c 同時(shí)創(chuàng)建多級(jí)目錄,程序輸出如下:

{(<Change.added: 1>, '/Users/satori/Desktop/project/a/b/c'), 
 (<Change.added: 1>, '/Users/satori/Desktop/project/a/b'), 
 (<Change.added: 1>, '/Users/satori/Desktop/project/a')}

整個(gè)過(guò)程還是比較簡(jiǎn)單的,然后除了 watch 函數(shù)之外,還有一個(gè) awatch。這兩者的作用是一樣的,參數(shù)也全部一樣,只不過(guò) awatch 需要和協(xié)程搭配,我們舉個(gè)例子。

import?sys
import?asyncio
from?asyncio?import?StreamReader
from?watchfiles?import?awatch,?Change
#?監(jiān)視指定目錄
async?def?watch_files(path):
????#?awatch(...)?返回的是異步生成器,需要通過(guò)?async?for?遍歷
????async?for?change?in?awatch(path):
????????print("-"?*?20)
????????#?change?是一個(gè)集合,里面可能會(huì)涉及到多個(gè)文件的變更
????????for?item?in?change:
????????????if?item[0]?==?Change.added:
????????????????operation?=?"你增加了"
????????????elif?item[0]?==?Change.modified:
????????????????operation?=?"你修改了"
????????????else:
????????????????operation?=?"你刪除了"
????????????print(f"{operation}?`{item[1]}`")
????????print("\n")
#?讀取命令行輸入,但是注意:不可以使用 input 函數(shù),因?yàn)樗峭阶枞{(diào)用
#?這種調(diào)用在協(xié)程當(dāng)中是大忌,會(huì)阻塞整個(gè)線程,我們需要改造成異步模式
async?def?read_from_stdin():
????reader?=?asyncio.StreamReader()
????protocol?=?asyncio.StreamReaderProtocol(reader)
????loop?=?asyncio.get_running_loop()
????await?loop.connect_read_pipe(lambda:?protocol,?sys.stdin)
????return?reader
#?read_from_stdin?函數(shù)的具體細(xì)節(jié)暫時(shí)不用太關(guān)注
#?只需要知道它能異步讀取命令行即可,關(guān)于這方面的內(nèi)容后續(xù)會(huì)介紹
#?然后定義主協(xié)程
async?def?main():
????#?監(jiān)視當(dāng)前目錄
????asyncio.create_task(watch_files("."))
????#?創(chuàng)建讀取器
????stdin_reader?=?await?read_from_stdin()
????while?True:
????????#?從命令行讀取輸入
????????command?=?await?stdin_reader.readline()
????????#?執(zhí)行命令
????????procs?=?await?asyncio.create_subprocess_shell(command)
????????await?procs.wait()
loop?=?asyncio.get_event_loop()
try:
????loop.run_until_complete(main())
finally:
????loop.close()

來(lái)看一下效果:

結(jié)果沒(méi)有問(wèn)題,文件的變化都檢測(cè)出來(lái)了。然后補(bǔ)充一點(diǎn):watch 和 awatch 可以同時(shí)監(jiān)聽(tīng)多個(gè)目錄,因?yàn)榈谝粋€(gè)參數(shù)是 *paths。

我們同時(shí)監(jiān)聽(tīng)多個(gè)目錄來(lái)測(cè)試一下,先在當(dāng)前目錄創(chuàng)建兩個(gè)子目錄:boy 和 girl,然后分別監(jiān)視它們。

輸出正常,因此這兩個(gè)函數(shù)可以監(jiān)聽(tīng)任意多個(gè)目錄。另外,由于目前監(jiān)聽(tīng)的是當(dāng)前目錄的兩個(gè)子目錄,所以當(dāng)前目錄的文件變更就看不到了,因?yàn)樗鼪](méi)有被監(jiān)視。

以上就是這兩個(gè)函數(shù)的基本用法,當(dāng)然這兩個(gè)函數(shù)還有其它參數(shù):

這里簡(jiǎn)單介紹幾個(gè)。

過(guò)濾器(watch_filter)

watchfiles 會(huì)監(jiān)視目錄的文件變化,但不是所有的文件都會(huì)記錄。

watchfiles 有一個(gè)內(nèi)置的過(guò)濾器,會(huì)將和業(yè)務(wù)無(wú)關(guān)的文件過(guò)濾掉,如果你還希望將其它格式的文件過(guò)濾掉,那么修改過(guò)濾器即可。

停止事件(stop_event)

監(jiān)視文件的時(shí)候,迭代器是不會(huì)停止的,如果想自由控制它的結(jié)束,可以傳遞一個(gè)事件。

import?asyncio
from?watchfiles?import?awatch
async?def?watch_files(*paths,?stop_event):
????async?for?_?in?awatch(*paths,?stop_event=stop_event):
????????pass
????print("停止監(jiān)視")
async?def?main():
????event?=?asyncio.Event()
????#?傳遞一個(gè)事件,準(zhǔn)確的說(shuō),只要有 is_set 方法,任何對(duì)象都行
????asyncio.create_task(watch_files(".",?stop_event=event))
????#?當(dāng)?event.is_set()?為?True?的時(shí)候,停止監(jiān)視
????print("is_set:?",?event.is_set())
????await?asyncio.sleep(3)??#?sleep?3
????event.set()
????print("三秒后,?is_set:?",?event.is_set())
????#?等待子協(xié)程打印完畢
????await?asyncio.sleep(0.1)
asyncio.run(main())
"""
is_set:??False
三秒后,?is_set:??True
停止監(jiān)視
"""

是否遞歸監(jiān)視(recursive)

如果該參數(shù)為 True,那么會(huì)遞歸監(jiān)視子目錄,否則只監(jiān)視頂層目錄。

其它參數(shù)基本很少用,就不再贅述了,有興趣可以自己了解一下。

到此這篇關(guān)于Python使用watchfiles實(shí)現(xiàn)監(jiān)控目錄變更的文章就介紹到這了,更多相關(guān)Python監(jiān)控目錄變更內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Python 引號(hào)、注釋、字符串

    淺析Python 引號(hào)、注釋、字符串

    這篇文章主要介紹了Python 引號(hào)、注釋、字符串的相關(guān)知識(shí),文中給大家提到了python中一對(duì)單引號(hào),一對(duì)雙引號(hào),三個(gè)單雙引號(hào)的區(qū)別和用法,需要的朋友可以參考下
    2019-07-07
  • 使用Python讀寫(xiě)及壓縮和解壓縮文件的示例

    使用Python讀寫(xiě)及壓縮和解壓縮文件的示例

    Python的os模塊中提供了基本的文件讀寫(xiě)方法,而zipfile模塊則針對(duì)文件的壓縮和解壓縮操作,這里我們就來(lái)看一下使用Python讀寫(xiě)及壓縮和解壓縮文件的示例:
    2016-07-07
  • python將excel轉(zhuǎn)換為csv的代碼方法總結(jié)

    python將excel轉(zhuǎn)換為csv的代碼方法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于python如何將excel轉(zhuǎn)換為csv的實(shí)例方法和代碼內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-07-07
  • 詳解Python3中的多重繼承和混入類(lèi)

    詳解Python3中的多重繼承和混入類(lèi)

    Python原生支持多重繼承,這使得我們可以從多個(gè)父類(lèi)中繼承屬性和方法,在本文中,我們將介紹Python中多重繼承的概念,并討論在實(shí)際情況下可能遇到的坑,我們還將討論如何使用混入類(lèi)來(lái)避免這些問(wèn)題,需要的朋友可以參考下
    2023-05-05
  • Python命令行參數(shù)解析工具 docopt 安裝和應(yīng)用過(guò)程詳解

    Python命令行參數(shù)解析工具 docopt 安裝和應(yīng)用過(guò)程詳解

    這篇文章主要介紹了Python命令行參數(shù)解析工具 docopt 安裝和應(yīng)用過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python使用urllib模塊和pyquery實(shí)現(xiàn)阿里巴巴排名查詢

    python使用urllib模塊和pyquery實(shí)現(xiàn)阿里巴巴排名查詢

    這篇文章主要介紹了python庫(kù)urllib及pyquery基本東西的應(yīng)用,實(shí)現(xiàn)阿里巴巴關(guān)鍵詞排名的查詢,其中涉及到urllib代理的設(shè)置,pyquery對(duì)html文檔的解析
    2014-01-01
  • python3中rsa加密算法詳情

    python3中rsa加密算法詳情

    這篇文章主要介紹了python3中rsa加密算法詳情,rsa加密,是一種加密算法,目前而言,加密算法,是對(duì)數(shù)據(jù)、密碼等進(jìn)行加密,下文更多相關(guān)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 基于Python構(gòu)建一個(gè)高效詞匯表

    基于Python構(gòu)建一個(gè)高效詞匯表

    在自然語(yǔ)言處理(NLP)領(lǐng)域,構(gòu)建高效的詞匯表是文本預(yù)處理的關(guān)鍵步驟,本文將解析一個(gè)使用Python實(shí)現(xiàn)的n-gram詞頻統(tǒng)計(jì)工具,感興趣的可以了解下
    2025-06-06
  • pyinstaller打包程序exe踩過(guò)的坑

    pyinstaller打包程序exe踩過(guò)的坑

    這篇文章主要介紹了pyinstaller打包exe踩過(guò)的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • PyQt5 在label顯示的圖片中繪制矩形的方法

    PyQt5 在label顯示的圖片中繪制矩形的方法

    今天小編就為大家分享一篇PyQt5 在label顯示的圖片中繪制矩形的方法,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06

最新評(píng)論

陇西县| 杭锦旗| 原阳县| 富阳市| 唐海县| 沈丘县| 新蔡县| 湟源县| 马龙县| 龙海市| 新河县| 东兰县| 泰和县| 泉州市| 嘉祥县| 临沧市| 祁门县| 丰顺县| 滨州市| 丰县| 全南县| 云南省| 麻江县| 宁晋县| 西宁市| 桃江县| 公安县| 孝昌县| 正镶白旗| 诸城市| 疏附县| 左贡县| 伊宁县| 湛江市| 淅川县| 修武县| 秦皇岛市| 如东县| 洞口县| 轮台县| 陵川县|