2016-04-25 41 views
0

我發現了一些方法來搜索用戶在目錄中創建的最新文件,但我需要確定是否存在更簡單的方法。大多數關於這個主題的帖子在某些情況下都有用,或者有很大的障礙,所以我希望能夠讓這些水不再感冒。獲取不斷更新文件的文件路徑

我在查看不斷增長的文件系統時遇到了困難,並且導致更多用戶遇到更多潛在錯誤。

我從Superlogics Winview CP 32獲取數據以獲得連續流式傳輸系統。在每次使用系統時,我都要求操作員輸入文件名的唯一標識符,其中包含我們需要跟蹤的系統的一些初始條件。我希望在沒有操作員/用戶幫助的情況下獲得該文件名。

最終,最終目標是削減我想要搜索的文件列表,並根據關鍵字進行過濾,因此我的第一本能是隻使用匹配的文件類型,修剪路徑中的所有文件夾到列表中,以及根據最大時間戳進行排序。我用了一些很常見的功能,從這些頁面:

def fileWalkIn(path='.',matches=[],filt='*.csv'): # Useful for walking through a given directory 
    """Iterates through all files under the given path using a filter.""" 
    for root, dirnames, filenames in os.walk(path): 

     for filename in fnmatch.filter(filenames, filt): 
      matches.append(os.path.join(root, filename)) 
      yield os.path.join(root, filename) 

def getRecentFile(path='.',matches=[],filt='*.dat'): 
    rr = max(fileWalkIn(path=path,matches=matches,filt=filt), key=os.path.getmtime) 
    return rr  

這讓我遠,但比較笨重,緩慢的,這意味着如果我想探索匹配的文件,我不能這樣做反覆,恐怕我得隨身攜帶一大堆匹配的文件。

理想情況下,我可以在運行中處理數據,在寫入時執行和打印實時數據,因此在此情況下此方法不可用。

我從這些頁面借用了一個由alex-martelli創建的不使用過濾器的新方法,它提供了與目錄相對的給出文件的選項,比fileWalkIn小得多,並且如果使用時間戳,則可以更快地工作。

def all_subdirs_of(b='.'): # Useful for walking through a given directory 
    # Create hashable list of files or directories in the parent directory 
    results = [] 
    for d in os.listdir(b): 

     bd = os.path.join(b, d) 
     if os.path.isfile(bd):  
      results.append(bd) 
     elif os.path.isdir(bd): 
      results.append(bd) 

    # return both 
    return results 

def newest(path='.'): 

    rr = max(all_subdirs_of(b=path), key=os.path.getmtime) 
    return rr 

def getActiveFile(newFile ='.'): 

    while os.path.exists(newFile): 

     newFile = newest(newFile) 
     if os.path.isfile(newFile): 

      return newFile 
     else: 
      if newFile: 
       continue 
      else: 
       return newFile 

這讓我更快速地訪問目錄中的活動文件,但只有在啓動我的數據收集後才能寫入其他文件。我可以在這裏看到各種各樣的問題,需要一些幫助來確定我是否已經放棄了兔子洞,並且有一個更簡單的解決方案,比如測試文件大小,或者是否存在潛在障礙較小的更有凝聚力的解決方案。

我找到了不同語言的其他答案(java,how-to-get-the-path-of-a-running-jar-file),但在Python中需要一些東西。我探索了watchdogwin32等功能,但都需要陡峭的學習曲線,而且我覺得我要麼非常接近,要麼完全改變我的範例。

回答

1

dircache可能會加快第二種方法。它是一個listdir的包裝器,它檢查目錄時間戳,並且只有在目錄內容發生變化時才重新讀取目錄內容。

除此之外,您確實需要監聽文件系統事件。快速谷歌出現了兩個點子包,pyinotify僅用於Linux和看門狗。

希望這會有所幫助。