【Python|第39期】监听目录取消文件只读属性
日期:2023年7月17日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助
,帮忙点个赞
,也可以关注我
,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006
文章目录
- 一、精彩回顾
- 二、前言
- 二、第三方监听目录变化库
- (1)Watchdog库
- (2)Pyinotify库
- (3)Gamin库
- (4)PyFilesystem2库
- 三、监听目录取消文件只读
- (1)首先,安装watchdog库
- (2)取消文件只读属性
- (3)事件处理器对象
- (4)观察者对象
- 四、最终实现的代码
一、精彩回顾
《Python学习的奇妙之旅》
《python3遍历目录的三种方法浅谈》
《python设置文件只读与取消文件只读》
《Python读取文件的三种方式》
二、前言
通过新版微信接收的文件都被修改了权限,文件均被设置为“只读
”。或许这对于微信来说是挺安全的,但是却给我们带来了不少的麻烦,想修改点东西,必须先取消文件只读属性,否者无法保存。
前段时间写过关于文件权限的文章(《python设置文件只读与取消文件只读》,结合目录遍历的知识(《python3遍历目录的三种方法浅谈》),再加个定时器不断遍历 微信接收文件的目录
,确实可以解决问题,但不是本文所要讲解的,感兴趣的小伙伴可以自行尝试下。
虽然微信版本在持续更新,但是“文件被设为只读”的行为却没有更改,看来只能用程序打败程序,监听微信接收文件的目录,接收一个文件就处理一个文件的方式,去解决文件只读的问题。
二、第三方监听目录变化库
在 Python
的标准库中,没有直接用于监听文件目录变化的内置模块。有几个流行的第三方库可以用于监听文件目录的变化,如下:
(1)Watchdog库
Watchdog
是一个功能强大且易于使用的库,提供了监视文件和目录变化的功能。它支持各种事件,如文件创建、修改、删除等,并可以在这些事件发生时执行自定义的回调函数。Watchdog库在 Python
社区中广泛使用,并且有良好的文档和示例代码。
(2)Pyinotify库
Pyinotify
是一个与 Linux
内核中的 inotify
机制集成的库,可以高效地监视文件和目录的变化。它提供了 Pythonic
的 API
,可以轻松地处理文件事件。Pyinotify
对于需要在Linux平台上进行文件监控的任务非常有用。
(3)Gamin库
Gamin
是另一个用于文件监控的库,它使用 Linux
上的 Gamin
守护进程作为后端。Gamin
库提供了一个简单的接口来监视文件和目录的变化,并可以触发相应的事件。
(4)PyFilesystem2库
PyFilesystem2
是一个通用的文件系统抽象库,它可以处理各种文件系统和存储。虽然它的主要目的是提供一个统一的 API
来访问不同类型的文件系统,但它也具有监视文件变化的功能。
三、监听目录取消文件只读
为了简化开发,这里打算采用第三方库 watchdog
来实现我们的需求。
(1)首先,安装watchdog库
pip install watchdog
如果不想污染全局库,想安装在虚拟环境中,可以这样做:
- 首先,创建一个虚拟环境
chmod_watchdog
,virtualenv chmod_watchdog
; - 其次,激活z虚拟环境,
\chmod_watchdog\Scripts\activate
; - 接着,安装
watchdog
库,pip install watchdog
; - 完成工作并想要退出虚拟环境,
\chmod_watchdog\Scripts\deactivate
(2)取消文件只读属性
- 判断文件是否只读
def is_file_read_only(file_path):if os.access(file_path, os.W_OK):# 如果文件或目录具有指定的权限,返回True。return Falseelse:# 如果文件或目录不具有指定的权限,# 或者检查过程中发生错误,返回False。return True
- 取消文件的只读属性
def unset_file_read_only(file_path):# 获取当前文件的权限标志位file_stat = os.stat(file_path)# 取消只读属性,将其权限更改为可写new_mode = file_stat.st_mode | stat.S_IWUSR# 设置新的权限标志位os.chmod(file_path, new_mode)
(3)事件处理器对象
- 创建事件处理器对象
class MyEventHandler(FileSystemEventHandler):def on_any_event(self, event):if event.is_directory: # 忽略文件夹的变化returnif event.event_type == 'created' or event.event_type == 'modified': # 只处理新建和修改事件file_path = event.src_pathremove_read_only(file_path)event_handler = MyEventHandler()
- 取消文件只读属性,函数会在文件变化时被调用
def remove_read_only(file_path):# file_path 参数是变化的文件路径print("文件已变化:", file_path)# 判断文件是否只读if is_file_read_only(file_path):# 文件是只读的# 取消文件的只读属性unset_file_read_only(file_path)else:# 文件不是只读的pass
(4)观察者对象
- 创建观察者对象
observer = Observer()
- 将自定义的事件处理器和要监视的目录绑定在一起
event_handler
:我们定义的自定义事件处理器的实例;
directory
:需要监视的目录路径;
recursive=True
表示要递归地监视目录中的子目录。
observer.schedule(event_handler, directory, recursive=True)
- 启动观察器,开始监听目录的变化
observer.start()
- 保持文件监视器(
Observer
)持续运行,并在收到键盘中断信号(KeyboardInterrupt
)时停止监视器的运行。
try:# 使用无限循环来保持观察器持续运行while True:# 在每次循环中,使用time.sleep(1)函数暂停1秒钟,以避免过度消耗CPU资源。time.sleep(1)
except KeyboardInterrupt:# 如果在循环中按下Ctrl+C,会引发KeyboardInterrupt异常。# 在异常处理块中,调用observer.stop()方法停止观察器的运行。observer.stop()
- 等待观察器线程的结束
observer.join()
最后,将其封装成一个监听目录的函数 start_monitoring(directory)
,具体如下所示:
# 监听目录的函数
def start_monitoring(directory):# 创建事件处理器对象event_handler = MyEventHandler()# 创建观察者对象observer = Observer()# 将自定义的事件处理器和要监视的目录绑定在一起observer.schedule(event_handler, directory, recursive=True)# 启动观察器,开始监听目录的变化observer.start()try:# 使用无限循环来保持观察器持续运行while True:# 在每次循环中,使用time.sleep(1)函数暂停1秒钟,以避免过度消耗CPU资源。time.sleep(1)except KeyboardInterrupt:# 如果在循环中按下Ctrl+C,会引发KeyboardInterrupt异常。# 在异常处理块中,调用observer.stop()方法停止观察器的运行。observer.stop()# 等待观察器线程的结束observer.join()
四、最终实现的代码
打开微信,确定自己微信的文件管理路径 E:\WeChat Files\
,接着开启监听 start_monitoring("E:/WeChat Files/")
,就可以实现接收文件后立马自动取消文件只读属性啦,源码如下所示:
# coding:utf-8import 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):# 如果文件或目录具有指定的权限,返回True。return Falseelse:# 如果文件或目录不具有指定的权限,# 或者检查过程中发生错误,返回False。return True# 取消文件的只读属性
def unset_file_read_only(file_path):# 获取当前文件的权限标志位file_stat = os.stat(file_path)# 取消只读属性,将其权限更改为可写new_mode = file_stat.st_mode | stat.S_IWUSR# 设置新的权限标志位os.chmod(file_path, new_mode)print("取消文件只读属性:",file_path)# 取消文件只读属性,函数会在文件变化时被调用
def remove_read_only(file_path):# file_path 参数是变化的文件路径print("文件已变化:", file_path)# 判断文件是否只读if is_file_read_only(file_path):# 文件是只读的# 取消文件的只读属性unset_file_read_only(file_path)else:# 文件不是只读的passclass MyEventHandler(FileSystemEventHandler):def on_any_event(self, event):print("event_type:",event.event_type)if event.is_directory: # 忽略文件夹的变化returnif event.event_type == 'created' or event.event_type == 'modified': # 只处理新建和修改事件file_path = event.src_pathremove_read_only(file_path)# 监听目录的函数
def start_monitoring(directory):# 创建事件处理器对象event_handler = MyEventHandler()# 创建观察者对象observer = Observer()# 将自定义的事件处理器和要监视的目录绑定在一起observer.schedule(event_handler, directory, recursive=True)# 启动观察器,开始监听目录的变化observer.start()try:# 使用无限循环来保持观察器持续运行while True:# 在每次循环中,使用time.sleep(1)函数暂停1秒钟,以避免过度消耗CPU资源。time.sleep(1)except KeyboardInterrupt:# 如果在循环中按下Ctrl+C,会引发KeyboardInterrupt异常。# 在异常处理块中,调用observer.stop()方法停止观察器的运行。observer.stop()# 等待观察器线程的结束observer.join()if __name__ == "__main__":# 获取要监听的文件夹路径# NO1:OKdirectory = 'E:/WeChat Files'# directory = 'E:/WeChat Files/'# NO2:OK# directory = 'E:\\WeChat Files'# NO3:Fail# directory = 'E:\WeChat Files'# 开启监听,满足条件就取消文件只读属性start_monitoring(directory)
我的微信公众号【会飞的小猴子】,等你来关注哦 ^ - ^
参考文章:
- 《python设置文件只读与取消文件只读》
- 《python文件监控模块Watchdog使你的文件管理更轻松》
版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/131749805
【Python|第39期】监听目录取消文件只读属性相关推荐
- FileAlterationMonitor监听目录下文件变化
工具类 FileMonitor package com.ncs.wavtrans.utils;import org.apache.commons.io.monitor.FileAlterationLi ...
- woo如何监听目录和文件变动,woo目录中的文件被改变,监听文件被修改权限
记录下woo语言监听文件和和文件夹变动后触发事件 非常完整的例子了. 注意由于文件监听属于工具类,则需要使用wop而不是woo print('file notify')-- 初始化监听实列 local ...
- Qt5开发及实例学习之监听目录
2019独角兽企业重金招聘Python工程师标准>>> #include "watcher.h" #include <QVBoxLayout> #in ...
- ROS中 Python/C++ 键盘按键监听事件
ROS中 Python/C++ 键盘按键监听事件 这几天在肝全国智能驾驶大赛,真就挺累的:抓狂思考,手搓代码,疯狂编译,要命运行.在这趟火车上,被各种各样的问题卡住甚至卡死,就很难受好吧.至今,我深深 ...
- linux+默认监听+目录,C# 时时监听目录文件改动
C# 时时监听目录文件改动: public static class DirectoryListen { public static string CountListXmlPath = CountCo ...
- python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小
python 实现统计ftp服务器指定目录下文件夹数目.文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏. 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小,类 ...
- python tcp不用循环监听_网络编程: TCP
1. IP 地址 概念: 标识网络中设备的地址(需要联网才有没有联网, 是没有这个地址) 表现形式: ipv4 目前主要使用的, 点分十进制的格式,(192.168.3.43) 分为 4 段, 每段的 ...
- python监听键盘库_python监听、操作键盘鼠标库pynput详细教程|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ § 0.0.0 前言 监听.操作鼠标.键盘是实现自动化的捷径,比如我实现自动化签到用到了模拟键盘操作. p ...
- php 监控文件夹变化,swoole 开发中监听目录文件变化, 自动重启项目
在使用swoole的项目中, 在开发时, 会经常改动代码并查看效果, 由于swoole项目是常驻内存的, 代码改动后并不会影响已经在运行中并加载过该代码的程序, 所以需要重启项目. 为了在改动代码之后 ...
最新文章
- php依次替换src,如何在php中替换img中src内容
- 进腾讯了!(实习面经分享)
- python3写一个计算器_Python3 写了一个简单的模拟计算器 总是报错 有知道的大神 帮忙解答下 非常感谢...
- 【Python】全文3000字,Pyecharts制作可视化大屏全流程! (附代码分享)
- 排序算法java 简书_史上最全经典排序算法总结(Java实现)
- 提取过程_大米多肽提取过程中如何应用膜分离技术呢?
- ADSL提速 从入门到精通
- MyBatis之使用resultMap实现高级映射
- android studio break,Android Studio IDE: Break on Exception
- C# List的克隆
- 查看及修改当前数据库的所支持的数据库引擎以及默认数据库引擎
- [Unity基础]01Unity基本操作
- 时速云CEO:相对于IaaS和PaaS,未来CaaS将如何定位?
- CentOS install btsync
- C语言知识点思维导图
- python二级题库(百分之九十原题) 刷题软件推荐
- archlinux + dwm系统美化
- html 脚本错误,脚本错误怎么解决,教您脚本错误怎么解决?
- Vulnhub_Noob
- 进制之间快速转换技巧
热门文章
- Ubuntu进入root权限命令——sudo和su命令详解
- 时序数据预测:LSTM
- 欧盟遗憾英议会否决“脱欧”协议 称“脱欧”乱局风险加大
- html广告加图片,视频某段加一张图片覆盖 视频中间段画面有广告加一张图片遮住...
- 程序员脱单秘籍 | 我跟JVM搞对象!【深度剖析对象的创建和内存分配】
- 打造前端构建环境(1)
- 设置和获取文本框的value
- ERR_SSL_VERSION_OR_CIPHER_MISMATCH on win10 chrome
- python从入门到精通-Python从入门到精通 PDF 完整超清版
- C++的编程思想和进阶编程