【问题标题】:While loop to monitor folder and run script if conditon is true如果条件为真,则循环监视文件夹并运行脚本
【发布时间】:2014-06-03 23:02:11
【问题描述】:

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

我想我想为此使用一个while循环...我将使用以下内容监视文件夹:

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

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

非常感谢任何帮助

谢谢

【问题讨论】:

  • 你可能会更好地使用这样的东西:github.com/seb-m/pyinotify 而不是 while 循环。你是windows环境还是linux?
  • 您不应该只检查列表中的len()。如果有人在 30 秒内添加了一个文件,然后又删除了另一个文件怎么办?会有一个新文件,但len() 不会改变,你的脚本会错过它。相反,您必须保存并比较整个列表。更好的是,使用set() 快速查看哪个 文件是新文件。

标签: python while-loop wait


【解决方案1】:

根据目录的大小,如果目录的 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 个名为 Done 的目录,并且没有文件。文件,一次 1 个,将被添加到目录并通过脚本处理。一次最多可以有 5 个文件。
  • 这仍然有效。每当目录列表发生修改时,目录的 mtime 就会发生变化。仅当 mtime 不同于初始值或上次更改时,才会进行比较。无需在 if added: 块中打印,您可以对“已添加”集中的新文件执行您想要的操作。
  • 这正是我想要的。非常感谢!
【解决方案2】:

等待 30 秒做

import time # outside the loop

time.sleep(30)

【讨论】:

    【解决方案3】:

    这是一个通用的解决方案,当调用它时,将永远等待,直到传递的目录被修改。该函数可以在任何对目录执行操作的代码之前调用,例如计算有多少文件等。它可以用来阻止执行,直到 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,以防我一修改目录就开始睡眠。希望这对需要通用方法的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 2017-08-25
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多