2011-02-16 114 views
1

我有一個有很多子目錄的目錄。避免以前的文件

我正在運行這些目錄並找到一些文件並在這些文件上運行一些命令。我怎樣才能把指針放在我完成的地方?有時候這個過程會被打亂,下一次我運行這個程序時,我想從我離開的地方開始。

def locate(pattern, root=os.curdir): 
    '''Locate all files matching supplied filename pattern in and below 
    supplied root directory.''' 

    for path, dirs, files in os.walk(os.path.abspath(root)): 
     for filename in fnmatch.filter(files, pattern): 
      yield os.path.join(path, filename) 



for filename in locate("*.dll"): 
#do something 
+0

有關將狀態添加到生成器的類似問題可以在這裏找到[link] http://stackoverflow.com/questions/1939015/singleton-python-generator-or-pickle-a-python-generator –

回答

1

有幾個方法,你可以做到這一點......但可能是最簡單的創建,例如,沿着每個已處理的文件中端建立一個新文件,然後爲它檢查。例如:

for filename in locate("*.dll"): 
    if os.path.exists(filename + ".processed"): 
     continue 
    process(filename) 
    open(filename + ".processed", "w").close() 

for filename in locate("*.processed"): 
    os.remove(filename) 
1

我不喜歡混亂,我想在終止和恢復腳本之間可能會有一段時間。因此,我的首選方法是創建在根目錄中的文件與已處理的文件列表:

rootdir = os.curdir if len(sys.argv) < 2 else sys.argv[1] # or something 
logfilename = os.path.join(rootdir, 'processed') 
if os.path.exists(logfilename): 
    with open(logfilename, 'r') as logfile: 
     processed = set(logfile.read().split()) 
else: 
    processed = set() 

filegen = (f for f in locate("*.pdf", rootdir) if f not in processed) 
with open(logfilename, 'a') as logfile: 
    for filename in filegen: 
     do_something(filename) 
     logfile.write(filename + '\n') 

os.remove(logfilename) 

當然,這隻有當你失敗後運行在同一個目錄的腳本工作;如果這是一個問題,David Wolever的解決方案是一個選項,或者您可以設置日誌文件的固定位置。另一個有趣的方法是在遍歷的每個目錄中留下「麪包屑」。你可能會重新處理幾個文件,但那不會有太大的損失。