python 监控一个文件夹?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 监控一个文件夹?相关的知识,希望对你有一定的参考价值。
怎么用python 监控一个文件夹并且当其中的文件修改后,发邮件通知我
参考技术A 笨办法是在循环中不断读取目录以及目录中文件的最后修改时间,如果有变更,则说说文件被修改。这种办法需要不断的循环读取文件信息,这对cpu占用较高,同时也会产生一定的磁盘IO,短时间小范围使用尚可,如果长时间运行在服务器上,或者监控一个包含很多文件的目录则不可取。
办法之二是利用操作系统提供的功能来实现。
比如在Windows中,可以利用Windows API【ReadDirectoryChangesW】来实现。这可以免去大量的磁盘IO。因为文件修改的频率一般不高,可以使用定计时器进行循环,对cup的占用也会少很多。 参考技术B from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from time import sleep
import smtplib
from email.mime.text import MIMEText
from email.header import Header
class WatchFiles(FileSystemEventHandler):
def on_moved(self, event):
content = "file has been moved ".format(event.src_path)
print(content)
send_email(content)
def on_created(self, event):
content = "file has been create ".format(event.src_path)
print(content)
send_email(content)
def on_deleted(self, event):
content = "file has been deleted ".format(event.src_path)
print(content)
send_email(content)
def on_modified(self, event):
content = "file has been modified ".format(event.src_path)
print(content)
send_email(content)
def send_email(content):
# 第三方邮件服务系统
mail_host = "smtp.**.com" # 设置服务器
port = 8080 # 服务器端口号
mail_user = "user" # 用户名
mail_pass = "password" # 口令
sender = 'test' # 发送邮箱
receivers = ['test1'] # 接收邮件
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header("邮箱测试", 'utf-8')
message['To'] = Header("邮箱测试", 'utf-8')
subject = '邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, port)
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print("Error: 无法发送邮件")
if __name__ == '__main__':
observer = Observer()
watch_file = WatchFiles()
path = r'D:\pyfile'
observer.schedule(watch_file, path, True)
observer.start()
try:
while True:
sleep(2)
except KeyboardInterrupt:
observer.stop()
observer.join()
编码不易,望采纳追答
send_email不是class里面的内置函数,是外部的
本回答被提问者采纳 参考技术C 监控,其实就是周期性的启动判断程序。这判断程序要看你的具体需求,也就文件怎么算修改了:判断文件大小?读取最后修改时间?还是读取文件和原文件进行比较?
周期性执行,简单的就弄个循环就行,这样程序必须一直运行,不可靠,因为程序可能会被关闭。
所以最好是把程序做成系统服务。
发邮件就比较简单,网上一堆现成的源码。追问
能否帮忙写下语句,小白。需求是文件夹内的某个文件内容进行改变了。然后把被修改内容的文件名字发给我。
利用python监控文件被修改
需求:
利用python编写监控程序,监控一个文件目录,当目录下的文件发生改变时,实现有修改就发报警邮件
邮件使用QQ邮箱,需要开启smtp,使用手机发生短信,腾讯会给你发邮箱密码。如下所示:
把这个密码填到程序中。
python版本
[[email protected] day01]# python Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
2.程序代码如下:
监控主程序
[[email protected] day01]# cat montest.py #!/usr/bin/env python #coding:utf-8 import sys import pyinotify from sendMail import send try: path = sys.argv[1] except: raise(AttributeError("has no attribute path")) class MyEvent(pyinotify.ProcessEvent): def process_IN_MODIFY(self,event): ‘‘‘print("hell world") print ("%s be chandg "event.name) ‘‘‘ content = "%s be change" %(path+event.name) title = "refine‘s mail" froms = "[email protected]" ‘‘‘发邮件账号‘‘‘ to = "[email protected]" ‘‘‘接收邮件账号‘‘‘ send(content,title,froms,to) print (content) def main(path): vm = pyinotify.WatchManager() vm.add_watch(path,pyinotify.ALL_EVENTS,rec = True) event = MyEvent() notifier = pyinotify.Notifier(vm,event) notifier.loop() main(path)
发生邮件程序
[[email protected] day01]# cat sendMail.py #!/usr/bin/env python #coding:utf-8 import smtplib from email.mime.text import MIMEText def send(content,title,froms,*to): msg = MIMEText(content,"plain","utf-8") msg["Subject"]= title msg["From"]= froms msg["To"] = ",".join(to) server = smtplib.SMTP_SSL("smtp.qq.com",465) server.login("[email protected]","zqyricvcbed") ‘‘‘此处写你发邮件的qq和密码‘‘‘ server.sendmail(froms,list(to),msg.as_string()) server.quit() if __name__ == ‘__main__‘: ‘‘‘ content = "hello I am alvin" title = "alvin‘s mail" froms = "[email protected]" to = "[email protected]" send(content,title,froms,to) ‘‘‘
3.实战测试如下:
本文出自 “知识改变命运” 博客,请务必保留此出处http://ahtornado.blog.51cto.com/4826737/1949661
以上是关于python 监控一个文件夹?的主要内容,如果未能解决你的问题,请参考以下文章