2015-11-15 30 views
0

我是新來的Python,雖然已經閱讀並享受它爲止,有∂經驗,其中∂→0重新創建輸入文件夾樹分析

我有一個文件夾樹,每個文件夾在樹的分支的底部包含許多文件。對我來說,這整棵樹在輸入

我會執行幾個分析步驟(我相信這些與這個問題無關),我希望返回的結果與輸入的結果相同,稱爲輸出

我有兩個想法:

  1. 通讀遞歸使用os.walk()每個文件夾和每個文件進行分析,並
  2. 使用這樣的功能shutil.copytree()和沿途某處進行分析。所以實際上,我不想複製樹,而是複製它的結構,但用新文件。我認爲這可能是一種'黑客',因爲我確實想要使用每個輸入文件來創建輸出文件,所以我不需要copy命令,而需要一個analyse命令。其餘的應該保持不變,只要我的想象力讓我明白。

我有選擇1和與選項2

對於規模較小的樹木了零經驗小經驗,到現在爲止我已經硬編碼的路徑,這已經變得太耗費時間,在這一點上。

我也看到了更多的平凡方式,如使用glob先找到所有我想和對他們的工作的文件,但我不知道如何這可能幫助找到一個快捷方式重現輸入樹爲我的輸出。

我在選項1的嘗試看起來是這樣的:

import os 

for root, dirs, files in os.walk('/Volumes/Mac OS Drive/Data/input/'): 
    # I have no actual need to print these, it just helps me see what is happening 
    print root, "\n"   
    print dirs, "\n" 
    # This is my actual work going on 
    [analysis_function(name) for name in files] 

但我擔心這將是非常緩慢的,我也想這樣做某種上的文件過濾太 - 例如.DS_Store文件在mac樹中創建的結果包含在上述結果中。我會嘗試使用fnmatch模塊來只過濾我想要的文件。

我在copytree函數中看到,可以根據模式忽略文件,這可能會有所幫助,但是我不明白從哪裏可以將分析函數放在每個文件上。

回答

1

您可以使用這兩個選項:你能提供自定義copy_function執行分析,而不是默認shutil.copy2shutil.copytree()(它是一種更加黑客攻擊的),或者你可以使用os.walk()有過的過程中更好的控制。

您不需要手動創建父目錄。copytree()爲您創建的父目錄,如果你使用os.walk()os.makedirs(root)可以創建父目錄:

#!/usr/bin/env python2 
import fnmatch 
import itertools 
import os 

ignore_dir = lambda d: d in ('.git', '.svn', '.hg') 
src_dir = '/Volumes/Mac OS Drive/Data/input/' # source directory 
dst_dir = '/path/to/destination/'  # destination directory 
for root, dirs, files in os.walk(src_dir): 
    for input_file in fnmatch.filter(files, "*.input"): # for each input file 
     output_file = os.path.splitext(input_file)[0] + '.output' 
     output_dir = os.path.join(dst_dir, root[len(src_dir):]) 
     if not os.path.isdir(output_dir): 
      os.makedirs(output_dir) # create destination directories 
     analyze(os.path.join(root, input_file), # perform analysis 
       os.path.join(output_dir, output_file)) 

    # don't visit ignored subtrees 
    dirs[:] = itertools.ifilterfalse(ignore_dir, dirs) 
+0

我已經成功地實現了這個,纔不得不作出(具體到我的模型)的輕微變化 - 它就像一個魅力!非常感謝! –