while循环监视文件夹并在条件为真时运行脚本

时间:2011-12-03 23:34:15

标签: python while-loop wait

我正在尝试编写一个监视文件夹的脚本,如果该文件夹中添加了一个文件,请处理该文件,然后将其移动到DONE文件夹。

我想我想使用while循环...我会用以下内容监视文件夹:

count = len(os.listdir('/home/lou/Documents/script/txts/'))
while (count = 1):
    print Waiting...

我希望脚本每隔30秒检查一次len(),如果它从1变为2,则运行脚本,否则等待30秒并检查len()。该脚本将新文件移动到一个文件夹,len()将返回1.脚本将全天候运行。

非常感谢任何帮助

感谢

3 个答案:

答案 0 :(得分:6)

根据目录的大小,如果目录的mtime已更改,则最好只检查文件的数量。如果您使用的是Linux,您可能也对inotify感兴趣。

import sys
import time
import os

watchdir = '/home/lou/Documents/script/txts/'
contents = os.listdir(watchdir)
count = len(watchdir)
dirmtime = os.stat(watchdir).st_mtime

while True:
    newmtime = os.stat(watchdir).st_mtime
    if newmtime != dirmtime:
        dirmtime = newmtime
        newcontents = os.listdir(watchdir)
        added = set(newcontents).difference(contents)
        if added:
            print "Files added: %s" %(" ".join(added))
        removed = set(contents).difference(newcontents)
        if removed:
            print "Files removed: %s" %(" ".join(removed))

        contents = newcontents
    time.sleep(30)

答案 1 :(得分:2)

等待30秒

import time # outside the loop

time.sleep(30)

答案 2 :(得分:0)

这是一个通用的解决方案,在调用时,将等待FOREVER,直到修改了传递的目录。可以在任何可以对目录执行操作的代码之前调用此函数,例如计算多少个文件等。它可以用来阻止执行,直到dir被修改:

def directory_modified(dir_path, poll_timeout=30):
    import os
    import time
    init_mtime = os.stat(dir_path).st_mtime
    while True:
        now_mtime = os.stat(dir_path).st_mtime
        if init_mtime != now_mtime:
            return True
        time.sleep(poll_timeout)

请注意,您可以覆盖超时,默认为30秒。这是使用中的功能:

>>> att_dir = '/data/webalert/attachments'
>>> directory_modified(att_dir, 5)   # Some time goes by while I modify the dir manually
True

如果在我修改目录后睡眠开始,则在最多5秒运行时间后该函数返回true。希望这能帮助那些需要通用方法的人。