2015-08-26 45 views
0

我們的項目中有一個要求,它檢測到任何放入python目錄中的東西。Python檢測任何東西放在一個目錄中

的過程是這樣的:

  • 會有運行幾乎所有的一天的時間(排序cron作業的),這將讓手錶上的目錄Python腳本。

  • 當有人將文件放入應檢測到文件的目錄中時。

  • 丟棄的文件將有zip,xml,json或ini格式。
  • 有沒有固定的方式,用戶將如何將文件放入該目錄(即人可以簡單地複製或移動它使用console通過cp or mv命令或人可能會從其他計算機做FTP transfer,或可能通過我們的上傳web interface

我能夠通過網頁界面而不是其他方式檢測到它。

任何人都可以建議我來檢測文件的方式下降:

def detect_file(watch_folder_path): 
    """ Detect a file dropped """ 
    watched_files = os.listdir(watch_folder_path) 
    if len(watched_files) > 0: 
     filename = watched_files[0] 
     print "File located :, filename 
+0

你在哪個平臺上?你使用什麼文件系統? –

+2

我剛剛注意到有人親切地寫了一個可移植的Python庫來做到這一點:https://pythonhosted.org/watchdog/這曾經是平臺依賴的東西。 –

回答

1

如果這是Linux系統我建議inotifywatch,因爲它似乎是因爲它可以爲每個事件配置,像創建MOVE_TO多。

有是它的一個Python包裝pyinotify它,你可以調用這樣的:

python -m pyinotify -v /my-dir-to-watch 
0

如何:

known_files = [] 

def detect_file(watch_folder_path): 
    files = os.listdir(watch_folder_path) 
    for file in files: 
     if file not in known_files:     
      #RAISE ALERT e.g. send email 
      known_files.append(file) 

的文件添加到known_files列表,一旦警報後,使其不保持警覺。

然後,您需要運行detect_files(),並以您的判斷頻率重複。我建議使用Timer來實現這一點。或者更簡單地說,在while True:語句中執行該函數,並且例如添加time.sleep(60)以每60秒運行detect_files()檢查。

0

如果你不希望使用任何依賴你的項目,你可以依靠一個腳本來計算的變化爲您的文件。假設這個腳本會一直運行,你可以寫出下面的代碼:如果你想使用這種方法來運行一個cron或者類似的東西,這個腳本

def is_interesting_file(f): 
    interesting_extensions = ['zip', 'json', 'xml', 'ini'] 
    file_extension = f.split('.')[-1] 
    if file_extension in interesting_extension: 
     return True 
    return False 

watch_folder_path = 0 
previous_watched_files = set() 

while True: 
    watched_files = set(os.listdir(watch_folder_path)) 
    new_files = watched_files.difference(previous_watched_files) 
    interesting_files = [filename for filename in new_files if is_interesting_file(filename)] 
    #Do something with your interesting files 

,可以隨時保存目錄列表中的文件或簡單數據庫爲sqlite並將其分配給previous_watched_files變量。然後,您可以進行一次迭代觀察目錄中的更改,清除數據庫/文件記錄並使用更新後的清單結果重新創建它們。

相關問題