2016-04-26 88 views
0

我想遍歷文件夾來執行特定文件的分析。如何迭代文件夾以查找Python中的特定文件?

比方說,我有3個文件夾名爲S1,S2S3。每個文件夾都包含一個名稱相同的文件,稱爲hi.csv。一旦我得到腳本成功遍歷每個文件夾並找到該文件,我將分析CSV並在每個文件夾中創建一個新的CSV文件。

代替分析代碼,我剛剛嘗試在第一個實例中打印文件。理想情況下,我會在每個子文件夾S1,S2S3下看到名爲hi.txt的文件名。

這是我到目前爲止已經試過,但它不工作:

fn = 'hi.txt' 
indir = '/Users/sheena/Desktop/Test' 
for root, dirs, filenames in os.walk(indir): 
    for d in dirs: 
     if os.path.isfile(fn): 
      print(f) 
+1

*上的任何進度不起作用*? – jonrsharpe

+0

您需要提供更多關於問題的實際情況,以及您嘗試過什麼,失敗的信息。否則它很容易被關閉。 – AlBlue

回答

0
if os.path.isfile(os.path.join(d,fn)): 

我猜...也許...這可能不是找到最好的方式匹配

for root, dirs, filenames in os.walk(indir): 
    for fname in filenames: 
     if fname == fn: 
      print os.path.join(root,fname) 

的文件可能是一個更好一點

+0

謝謝大家的意見。隨着你的建議,我能夠得到我想要的文件,現在我試圖分析這些文件,然後將文件輸出到每個文件夾中。我想: FN = 'diff.nii' 下載= '/用戶/希娜/桌面/ DTI' 的根 ,_,在文件名os.walk(下載):如果在文件名FN : FLT = FSL .FLIRT(bins = 640,cost_func ='mutualinfo') flt.inputs.in_file ='os.path。加入(root,fn)' flt.inputs.output_type =「NIFTI_GZ」 我收到一個錯誤,粘貼在下面。我會很感激任何建議!謝謝!! – Sheenas

+0

TraitError:FLIRTInputSpec實例的'in_file'特徵必須是現有文件名,但指定了'os.path.join(root,fn)'的值。 – Sheenas

+0

不要把引號放在'os.path.join ...' –

1

如果您想查看某個文件名,你應該CHEC k它在filenames,如果它是成功的,當前文件夾是rootdirs不能進入圖片。

fn = 'hi.txt' 
indir = '/Users/sheena/Desktop/Test' 
for root, _, filenames in os.walk(indir): 
    if fn in filenames: 
     print("Got: {}/{}".format(root, fn)) 

看看它是否按照你想要的方式工作。如果沒有,請發表評論。

+0

doh很好的答案...和OP應該可能接受這一個+1我不知道我在想什麼直接迭代文件名 –

+1

@JoranBeasley除了冗餘步驟你的代碼是正確的。但事情是我在SO上回答了類似的問題超過3次,出於某種原因,很多人對'root'和'dirnames'感到困惑,基本上關於'os.walk'返回的是什麼。 –

1

一個簡單的方法,看看有什麼地方出了錯只是後的第一個「for」循環添加一行

print(root, dirs, filenames) 

。你會得到的輸出是沿

/tmp ['s3', 's2', 's1', ...] ['test.py', 'GRADUATE BALLOT APPLICATION FORM 2016-17.doc', 'ankid6955d9721560531274cb8f50ff595a9bd39d66f', '.X0-lock'] 
/tmp/s3 [] ['hi.txt'] 
/tmp/s2 [] ['hi.txt'] 
/tmp/s1 [] ['hi.txt'] 
/tmp/hsperfdata_joshua [] ['391'] 
/tmp/cujc ['foo'] [] 
/tmp/yaourt-tmp-joshua [] [] 
/tmp/.Test-unix [] [] 
/tmp/.font-unix [] [] 
/tmp/.XIM-unix [] [] 

所以

  1. 「os.walk」可能不會做你希望它做什麼,它遍歷所有子目錄和東西線子目錄的子目錄(但這對您的代碼不是問題,可能只是一個更聰明/更快的方法)
  2. 所有文件都在「文件名」列表中 - 所以您正在迭代錯誤名單!當'root'爲'blah/S1','blah/S2'或'blah/S3'時,'hi.txt'在'文件名'列表中。
相關問題