2016-04-26 72 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'在'文件名'列表中。
相关问题