【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项目是常驻内存的, 代码改动后并不会影响已经在运行中并加载过该代码的程序, 所以需要重启项目. 为了在改动代码之后 ...
最新文章
- AI+零售:人工智能撬动零售变革
- 信息系统项目管理知识--
- pyqt5讲解1:窗口,QLabel,QLineEdit,QTextEdit
- 【C++】C++类的学习(一)——初识类
- 异常和中断处理流程: Exception- or Interrupt-Handler Procedures
- Glad You Came--带条件的线段树区间更新,区间查询(其实是单点查询)
- 移动应用框架 Ionic 4 Ionic for Everyone
- 马尔科夫决策过程(MDP):汽车租赁问题
- android 简书代码截图工具,Android 截屏
- 基于Python的淘宝用户行为分析
- 单片机学习笔记(数码管)
- Python 集合符号
- DC-DC隔离电源模块与非隔离电源模块有什么区别?
- OJ 1478 机器翻译
- windows10更新服务器修改,Windows 10彻底关闭自动更新(Windows Update和Windows Update Medic Service)...
- 【51CTO学院三周年】随身携带的象牙塔
- SPA单页面应用首屏加载速度提升方法
- 制作补丁与打补丁简单原理
- 翻译app上的图片文字信息提取好神奇?如何实现一个文字图片识别程序
- AAA云免费云主机推荐码