Python监控下载目录

在网上下载锵锵三人行的节目,为了某些大家都懂的原因,文件后缀名被改成了.mkv.pdf.
需求是:使用Python监控下载目录,一旦发现有下载完毕,自动把视频移动到统一的文件夹,并且自动改名。去掉.pdf

监控目录使用的是watchdog http://pythonhosted.org/watchdog/
这个库支持多个操作系统平台,这篇文章对此进行了一个非常不错的介绍:链接

关于下载完毕这个事件的捕捉:
我们使用迅雷或者其他下载工具下载的时候,一般会先生成一个临时文件,数据写入完成以后,再把这个文件,改名为所要下载的文件名。
文件重命名,在操作系统中,会被认定为文件的移动。例如我要把hello.txt改名为world.txt,实际上我们可以理解为:d:\test\hello.txt移动到了d:\test\world.txt。Linux下,文件重命名直接可以使用mv命令。所以这里监听on_moved事件。

话不多说,直接上代码:


import sys
import os
import time
import logging
import shutil
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler,FileSystemEventHandler,FileModifiedEvent

class FileEventHandler(FileSystemEventHandler):
    def __init__(self):
        FileSystemEventHandler.__init__(self)

    def on_moved(self, event):
        if event.is_directory:
            print("directory moved from {0} to {1}".format(event.src_path,event.dest_path))
        else:
            print("file moved from {0} to {1}".format(event.src_path,event.dest_path))
            fileAllName =str(event.dest_path.split('\\')[-1])
            if fileAllName.endswith('.mkv.pdf'):
                #on_moved事件结束后,实际上还是会有一些IO操作,故此处sleep一下
                time.sleep(10)
                fileName = fileAllName[:-8]
                destDir = 'E:\\课程\\凤凰大视野\\'
                shutil.move(event.dest_path,destDir)
                fromFile = destDir+fileAllName
                toFile= destDir+fileName+'.mkv'
                os.rename(fromFile,toFile)


    def on_created(self, event):
        if event.is_directory:
            print("directory created:{0}".format(event.src_path))
        else:
            print("file created:{0}".format(event.src_path))

    def on_deleted(self, event):
        if event.is_directory:
            print("directory deleted:{0}".format(event.src_path))
        else:
            print("file deleted:{0}".format(event.src_path))

    def on_modified(self, event):
        if event.is_directory:
            print("directory modified:{0}".format(event.src_path))
        else:
            print("file modified:{0}".format(event.src_path))

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path ='D:\Download' #sys.argv[1] if len(sys.argv) > 1 else '.'
    event_handler = FileEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(10)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

 

20170808:将.mkv.pdf格式,使用正则表达式进行匹配。规则为发现.abc.xyz格式的文件名,删除后面.xzy部分,这样更能应付一般情况:
代码仅仅替代on_moved方法:
 

    原文作者:python入门
    原文地址: https://my.oschina.net/u/2396236/blog/1503658
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞