社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

一个能监控文件变化的 Python 神器

Python编程时光 • 4 年前 • 428 次点击  

假设现在有一个应用场景,需要对文件系统进行监控,发生变化时产生日志,对新增的文件做一些相应的操作。

比如说应用到我之前的音乐高潮提取器:若当前文件夹下增加了一个音乐文件,监控器就调用音乐高潮提取器,自动提取该音乐文件的高潮部分。

这样的监控器写起来也不难,但是很花时间,有许多情况要考虑。不过幸好我们是写Python的,有许多轮子可以使用。

1. 准备

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

在终端输入以下命令安装我们所需要的依赖模块:

pip install watchdog

看到 Successfully installed xxx 则说明安装成功。

2. 基本使用

看门狗的使用并不复杂,请认真看以下代码和注释:

可以看到代码中有几个关键步骤,

1.配置各项信息;

2.生成事件处理器、监控器;

3.注册事件处理器、配置目录、递归执行(即同时监控子文件夹);

4:启动。

其实,看门狗的observer是基于 threading.Thread 对象的,所以observer很多属性都继承了 threading.Thread 的属性。

如果你不带参数地运行该脚本,就是要监控脚本文件所在的文件夹,如果要监控其他文件夹,记得运行时带文件夹的路径参数,如:

python obserber.py /data/home/ckend/

我们来试着运行看看:

可以看到,我在当前文件夹下做的所有操作都被记录下来了。接下来我们就试试怎么自定义一些操作。

3. 监控文件变化

如果你不知道怎么提取音乐文件的高潮部分,请看这篇文章:《Python自动提取音乐文件高潮》。

要实现这样的功能,我们有几种方法,一个是在原来log的处理器上做一些新增修改,比如多增一个函数调用音乐高潮提取器。第二个是重新继承 FileSystemEventHandler 类,并做相应的修改。这里我们还是要保留log的样式,只是在log的时候顺便提取音乐高潮,因此采用第一个方法。

看看 LoggingEventHandler 源代码中的 on_created ,这就是当文件创建时监控器的操作:

我们仅需要继承这个类并对 on_created 进行修改,就能完成我们想要的功能:

首先声明一个类,继承 LoggingEventHandler ,然后重载 on_created 函数,在这个函数中不仅记录文件事件变化,还要对mp3文件做一次音乐高潮提取。最后别忘了,生成事件处理器时要用我们新的类名。

看看效果,将 小永远.mp3 复制过来:

成功监控文件变化并提取到音乐高潮,生成高潮文件。这样,只要你保持这个Python进程不关闭,它就会一直监控这个文件夹,一旦有音乐文件进入,就会自动提取它的音乐高潮,在linux系统下,可以搭配supervisor使用,非常好用。


留言赠书

赠书规则给本文留言,然后 留言集赞数 排名前 5 的朋友,可获得《Python数据科学实践》赠书。

领书须知:提供拉赞截图

开奖时间:5月6日 20:00

注意:中奖者24小时内,必须添加我微信领取,逾期不候!为了大家都有机会中奖,本月已经中过书的朋友,再次中奖将不在赠书。

本批书籍由 北京大学出版社 赞助,再次致谢。也欢迎大家自行前往购买支持。



推荐阅读  点击标题可跳转
14 个 Python "冷兵器" 合集,让你的终端一秒开挂
4000字,一篇数据可视化 "保姆级" 攻略
使用 MitmProxy 玩爬虫的,这篇文章别错过了
又一个好用的 Python自带模块:优先级调度器
谷歌发布新编程语言,专治SQL各种“不服”
如果对你有帮助。
请不吝点赞,点在看,谢谢
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/113885
 
428 次点击