Python實(shí)現(xiàn)監(jiān)聽目錄并取消文件只讀屬性
一、前言
通過新版微信接收的文件都被修改了權(quán)限,文件均被設(shè)置為“只讀”?;蛟S這對(duì)于微信來說是挺安全的,但是卻給我們帶來了不少的麻煩,想修改點(diǎn)東西,必須先取消文件只讀屬性,否者無法保存。
前段時(shí)間寫過關(guān)于文件權(quán)限的文章(《python設(shè)置文件只讀與取消文件只讀》,結(jié)合目錄遍歷的知識(shí)(《python3遍歷目錄的三種方法淺談》),再加個(gè)定時(shí)器不斷遍歷 微信接收文件的目錄 ,確實(shí)可以解決問題,但不是本文所要講解的,感興趣的小伙伴可以自行嘗試下。
雖然微信版本在持續(xù)更新,但是“文件被設(shè)為只讀”的行為卻沒有更改,看來只能用程序打敗程序,監(jiān)聽微信接收文件的目錄,接收一個(gè)文件就處理一個(gè)文件的方式,去解決文件只讀的問題。
二、第三方監(jiān)聽目錄變化庫
在 Python 的標(biāo)準(zhǔn)庫中,沒有直接用于監(jiān)聽文件目錄變化的內(nèi)置模塊。有幾個(gè)流行的第三方庫可以用于監(jiān)聽文件目錄的變化,如下:
(1)Watchdog庫
Watchdog 是一個(gè)功能強(qiáng)大且易于使用的庫,提供了監(jiān)視文件和目錄變化的功能。它支持各種事件,如文件創(chuàng)建、修改、刪除等,并可以在這些事件發(fā)生時(shí)執(zhí)行自定義的回調(diào)函數(shù)。Watchdog庫在 Python 社區(qū)中廣泛使用,并且有良好的文檔和示例代碼。
(2)Pyinotify庫
Pyinotify 是一個(gè)與 Linux 內(nèi)核中的 inotify 機(jī)制集成的庫,可以高效地監(jiān)視文件和目錄的變化。它提供了 Pythonic 的 API,可以輕松地處理文件事件。Pyinotify 對(duì)于需要在Linux平臺(tái)上進(jìn)行文件監(jiān)控的任務(wù)非常有用。
(3)Gamin庫
Gamin 是另一個(gè)用于文件監(jiān)控的庫,它使用 Linux 上的 Gamin 守護(hù)進(jìn)程作為后端。Gamin 庫提供了一個(gè)簡單的接口來監(jiān)視文件和目錄的變化,并可以觸發(fā)相應(yīng)的事件。
(4)PyFilesystem2庫
PyFilesystem2 是一個(gè)通用的文件系統(tǒng)抽象庫,它可以處理各種文件系統(tǒng)和存儲(chǔ)。雖然它的主要目的是提供一個(gè)統(tǒng)一的 API 來訪問不同類型的文件系統(tǒng),但它也具有監(jiān)視文件變化的功能。
三、監(jiān)聽目錄取消文件只讀
為了簡化開發(fā),這里打算采用第三方庫 watchdog 來實(shí)現(xiàn)我們的需求。
(1)首先,安裝watchdog庫
pip install watchdog
如果不想污染全局庫,想安裝在虛擬環(huán)境中,可以這樣做:
首先,創(chuàng)建一個(gè)虛擬環(huán)境 chmod_watchdog,virtualenv chmod_watchdog;
其次,激活z虛擬環(huán)境,\chmod_watchdog\Scripts\activate;
接著,安裝 watchdog 庫,pip install watchdog;
完成工作并想要退出虛擬環(huán)境,\chmod_watchdog\Scripts\deactivate

(2)取消文件只讀屬性
判斷文件是否只讀
def is_file_read_only(file_path):
if os.access(file_path, os.W_OK):
# 如果文件或目錄具有指定的權(quán)限,返回True。
return False
else:
# 如果文件或目錄不具有指定的權(quán)限,
# 或者檢查過程中發(fā)生錯(cuò)誤,返回False。
return True取消文件的只讀屬性
def unset_file_read_only(file_path):
# 獲取當(dāng)前文件的權(quán)限標(biāo)志位
file_stat = os.stat(file_path)
# 取消只讀屬性,將其權(quán)限更改為可寫
new_mode = file_stat.st_mode | stat.S_IWUSR
# 設(shè)置新的權(quán)限標(biāo)志位
os.chmod(file_path, new_mode)(3)事件處理器對(duì)象
創(chuàng)建事件處理器對(duì)象
class MyEventHandler(FileSystemEventHandler):
def on_any_event(self, event):
if event.is_directory: # 忽略文件夾的變化
return
if event.event_type == 'created' or event.event_type == 'modified': # 只處理新建和修改事件
file_path = event.src_path
remove_read_only(file_path)
event_handler = MyEventHandler()取消文件只讀屬性,函數(shù)會(huì)在文件變化時(shí)被調(diào)用
def remove_read_only(file_path):
# file_path 參數(shù)是變化的文件路徑
print("文件已變化:", file_path)
# 判斷文件是否只讀
if is_file_read_only(file_path):
# 文件是只讀的
# 取消文件的只讀屬性
unset_file_read_only(file_path)
else:
# 文件不是只讀的
pass(4)觀察者對(duì)象
創(chuàng)建觀察者對(duì)象
observer = Observer()
將自定義的事件處理器和要監(jiān)視的目錄綁定在一起
- event_handler:我們定義的自定義事件處理器的實(shí)例;
- directory:需要監(jiān)視的目錄路徑;
- recursive=True 表示要遞歸地監(jiān)視目錄中的子目錄。
observer.schedule(event_handler, directory, recursive=True)
啟動(dòng)觀察器,開始監(jiān)聽目錄的變化
observer.start()
保持文件監(jiān)視器(Observer)持續(xù)運(yùn)行,并在收到鍵盤中斷信號(hào)(KeyboardInterrupt)時(shí)停止監(jiān)視器的運(yùn)行。
try:
# 使用無限循環(huán)來保持觀察器持續(xù)運(yùn)行
while True:
# 在每次循環(huán)中,使用time.sleep(1)函數(shù)暫停1秒鐘,以避免過度消耗CPU資源。
time.sleep(1)
except KeyboardInterrupt:
# 如果在循環(huán)中按下Ctrl+C,會(huì)引發(fā)KeyboardInterrupt異常。
# 在異常處理塊中,調(diào)用observer.stop()方法停止觀察器的運(yùn)行。
observer.stop()等待觀察器線程的結(jié)束
observer.join()
最后,將其封裝成一個(gè)監(jiān)聽目錄的函數(shù) start_monitoring(directory),具體如下所示:
# 監(jiān)聽目錄的函數(shù)
def start_monitoring(directory):
# 創(chuàng)建事件處理器對(duì)象
event_handler = MyEventHandler()
# 創(chuàng)建觀察者對(duì)象
observer = Observer()
# 將自定義的事件處理器和要監(jiān)視的目錄綁定在一起
observer.schedule(event_handler, directory, recursive=True)
# 啟動(dòng)觀察器,開始監(jiān)聽目錄的變化
observer.start()
try:
# 使用無限循環(huán)來保持觀察器持續(xù)運(yùn)行
while True:
# 在每次循環(huán)中,使用time.sleep(1)函數(shù)暫停1秒鐘,以避免過度消耗CPU資源。
time.sleep(1)
except KeyboardInterrupt:
# 如果在循環(huán)中按下Ctrl+C,會(huì)引發(fā)KeyboardInterrupt異常。
# 在異常處理塊中,調(diào)用observer.stop()方法停止觀察器的運(yùn)行。
observer.stop()
# 等待觀察器線程的結(jié)束
observer.join()四、最終實(shí)現(xiàn)的代碼

打開微信,確定自己微信的文件管理路徑 E:\WeChat Files\,接著開啟監(jiān)聽 start_monitoring("E:/WeChat Files/"),就可以實(shí)現(xiàn)接收文件后立馬自動(dòng)取消文件只讀屬性啦,源碼如下所示:
# coding:utf-8
import os,stat
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# 判斷文件是否只讀
def is_file_read_only(file_path):
if os.access(file_path, os.W_OK):
# 如果文件或目錄具有指定的權(quán)限,返回True。
return False
else:
# 如果文件或目錄不具有指定的權(quán)限,
# 或者檢查過程中發(fā)生錯(cuò)誤,返回False。
return True
# 取消文件的只讀屬性
def unset_file_read_only(file_path):
# 獲取當(dāng)前文件的權(quán)限標(biāo)志位
file_stat = os.stat(file_path)
# 取消只讀屬性,將其權(quán)限更改為可寫
new_mode = file_stat.st_mode | stat.S_IWUSR
# 設(shè)置新的權(quán)限標(biāo)志位
os.chmod(file_path, new_mode)
print("取消文件只讀屬性:",file_path)
# 取消文件只讀屬性,函數(shù)會(huì)在文件變化時(shí)被調(diào)用
def remove_read_only(file_path):
# file_path 參數(shù)是變化的文件路徑
print("文件已變化:", file_path)
# 判斷文件是否只讀
if is_file_read_only(file_path):
# 文件是只讀的
# 取消文件的只讀屬性
unset_file_read_only(file_path)
else:
# 文件不是只讀的
pass
class MyEventHandler(FileSystemEventHandler):
def on_any_event(self, event):
print("event_type:",event.event_type)
if event.is_directory: # 忽略文件夾的變化
return
if event.event_type == 'created' or event.event_type == 'modified': # 只處理新建和修改事件
file_path = event.src_path
remove_read_only(file_path)
# 監(jiān)聽目錄的函數(shù)
def start_monitoring(directory):
# 創(chuàng)建事件處理器對(duì)象
event_handler = MyEventHandler()
# 創(chuàng)建觀察者對(duì)象
observer = Observer()
# 將自定義的事件處理器和要監(jiān)視的目錄綁定在一起
observer.schedule(event_handler, directory, recursive=True)
# 啟動(dòng)觀察器,開始監(jiān)聽目錄的變化
observer.start()
try:
# 使用無限循環(huán)來保持觀察器持續(xù)運(yùn)行
while True:
# 在每次循環(huán)中,使用time.sleep(1)函數(shù)暫停1秒鐘,以避免過度消耗CPU資源。
time.sleep(1)
except KeyboardInterrupt:
# 如果在循環(huán)中按下Ctrl+C,會(huì)引發(fā)KeyboardInterrupt異常。
# 在異常處理塊中,調(diào)用observer.stop()方法停止觀察器的運(yùn)行。
observer.stop()
# 等待觀察器線程的結(jié)束
observer.join()
if __name__ == "__main__":
# 獲取要監(jiān)聽的文件夾路徑
# NO1:OK
directory = 'E:/WeChat Files'
# directory = 'E:/WeChat Files/'
# NO2:OK
# directory = 'E:\\WeChat Files'
# NO3:Fail
# directory = 'E:\WeChat Files'
# 開啟監(jiān)聽,滿足條件就取消文件只讀屬性
start_monitoring(directory)到此這篇關(guān)于Python實(shí)現(xiàn)監(jiān)聽目錄并取消文件只讀屬性的文章就介紹到這了,更多相關(guān)Python監(jiān)聽目錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python GUI庫圖形界面開發(fā)之PyQt5輸入對(duì)話框QInputDialog詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5輸入對(duì)話框QInputDialog詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02
python和C++共享內(nèi)存?zhèn)鬏攬D像的示例
這篇文章主要介紹了python和C++共享內(nèi)存?zhèn)鬏攬D像的示例,幫助大家利用python處理圖片,感興趣的朋友可以了解下2020-10-10
教你如何識(shí)別代理IP的真實(shí)地理位置(使用Python庫)
本文介紹了IP數(shù)據(jù)庫查詢、反向DNS查詢和網(wǎng)絡(luò)延遲測量三種方法,并通過案例分析和代碼實(shí)現(xiàn)展示了如何使用Python庫進(jìn)行IP地理位置查詢,需要的朋友可以參考下2024-03-03
pycharm上的python虛擬環(huán)境移到離線機(jī)器上的方法步驟
本人在工作中需要在離線Windows環(huán)境中使用,本文主要介紹了pycharm上的python虛擬環(huán)境移到離線機(jī)器上的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2021-10-10
Pytorch四維Tensor轉(zhuǎn)圖片并保存方式(維度順序調(diào)整)
這篇文章主要介紹了Pytorch四維Tensor轉(zhuǎn)圖片并保存方式(維度順序調(diào)整),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python用selenium實(shí)現(xiàn)自動(dòng)登錄和下單的項(xiàng)目實(shí)戰(zhàn)
本文主要介紹了Python用selenium實(shí)現(xiàn)自動(dòng)登錄和下單的項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python實(shí)現(xiàn)多線程HTTP下載器示例

