2011-12-03 48 views
4

我想寫一個腳本來監視一個文件夾,如果文件夾有一個文件添加到它,處理該文件,然後將其移動到一個完成文件夾。雖然循環監視文件夾和運行腳本,如果條件爲真

我想,我想用這個while循環...我會監視的文件夾的東西,如:

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

我希望腳本檢查LEN()每30秒,如果從1更改爲2,運行該腳本,否則等待30秒並檢查len()。該腳本會將新文件移動到一個文件夾,並且len()將返回到1.腳本將全天候運行。

任何幫助是極大的讚賞

感謝

+2

你可能會更喜歡這樣的:https://github.com/seb-m/pyinotify而不是一個while循環。你在Windows環境或Linux? –

+0

我正在使用Fedora 16 –

+0

您不應該只檢查列表的len()。如果有人在30秒內添加一個文件然後刪除另一個文件,該怎麼辦?會有一個新文件,但是'len()'不會改變,你的腳本會錯過它。相反,你必須保存並比較整個列表。更好的是,使用'set()'快速查看*哪個*文件是新的。 – kindall

回答

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) 
+0

在文件夾中將會有1個dir命名爲Done,並且沒有文件。一次一個的文件將被添加到目錄並通過腳本進行。那麼每次在那裏的大多數文件將是5. –

+0

這仍然有效。目錄的mtime隨時更改目錄列表。只有當mtime與初始值不同或最後一次更改時纔會進行比較。您可以使用「添加」集中的新文件完成所需內容,而不是在if添加:塊中打印。 – jordanm

+0

這正是我正在尋找的。非常感謝你! –

0

這是一個通用的解決方案,當被調用時,將等待FOREVER,直到傳遞的目錄被修改。

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。希望這有助於那些需要通用方法的人。