如何在Python中遍历文件夹以查找特定文件?

如何在Python中遍历文件夹以查找特定文件?,python,Python,我正在尝试遍历文件夹以对特定文件执行分析 假设我有3个文件夹,分别名为S1、S2和S3。每个文件夹都包含一个同名文件,名为hi.csv。一旦脚本成功地遍历每个文件夹并找到该文件,我将让它分析CSV并在每个文件夹中创建一个新的CSV文件 作为分析代码的替代,我刚刚尝试在第一个实例中打印文件。理想情况下,我会在每个子文件夹下看到名为hi.txt的文件名、S1、S2和S3 以下是我迄今为止尝试过的方法,但它不起作用: fn = 'hi.txt' indir = '/Users/sheena/Deskt

我正在尝试遍历文件夹以对特定文件执行分析

假设我有3个文件夹,分别名为
S1
S2
S3
。每个文件夹都包含一个同名文件,名为
hi.csv
。一旦脚本成功地遍历每个文件夹并找到该文件,我将让它分析CSV并在每个文件夹中创建一个新的CSV文件

作为分析代码的替代,我刚刚尝试在第一个实例中打印文件。理想情况下,我会在每个子文件夹下看到名为
hi.txt
的文件名、
S1
S2
S3

以下是我迄今为止尝试过的方法,但它不起作用:

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)
我想。。。大概这可能不是找到匹配文件的最佳方法

for root, dirs, filenames in os.walk(indir):
    for fname in filenames:
        if fname == fn:
           print os.path.join(root,fname)
可能会好一点

我想。。。大概这可能不是找到匹配文件的最佳方法

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

可能更好一些

如果您试图检查某个文件名,您应该在
文件名
中检查它,如果成功,则当前文件夹为
root
<代码>目录不进入图片

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

看看它是否按你想要的方式工作。如果没有,请发表评论。

如果您试图检查某个文件名,您应该在
文件名中检查它,如果成功,则当前文件夹为
root
<代码>目录
不进入图片

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

看看它是否按你想要的方式工作。如果没有,请发表评论。

一种查看问题的简单方法是添加一行

print(root, dirs, filenames)
就在第一个“for”循环之后。您将得到的输出与

/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 [] []
所以

  • “os.walk”可能并没有达到您所期望的效果,它正在迭代所有子目录和子目录的子目录(但这不是您的代码的问题,可能只是有一种更智能/更快的方法)
  • 所有的文件都在“文件名”列表中-所以你在错误的列表上迭代当“root”是“blah/S1”、“blah/S2”或“blah/S3”时,“hi.txt”在“filenames”列表中

  • 要想知道哪里出了问题,一个简单的方法是添加一行

    print(root, dirs, filenames)
    
    就在第一个“for”循环之后。您将得到的输出与

    /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 [] []
    
    所以

  • “os.walk”可能并没有达到您所期望的效果,它正在迭代所有子目录和子目录的子目录(但这不是您的代码的问题,可能只是有一种更智能/更快的方法)
  • 所有的文件都在“文件名”列表中-所以你在错误的列表上迭代当“root”是“blah/S1”、“blah/S2”或“blah/S3”时,“hi.txt”在“filenames”列表中

  • 关于“不起作用”的任何进展?你需要提供更多信息,说明问题的实质是什么,你尝试了什么,失败了什么。否则它很容易被关闭。关于“不起作用”的任何进展?你需要提供更多信息,说明问题的实质是什么,你尝试了什么,失败了什么。否则很容易被关闭。谢谢大家的评论。有了你的建议,我可以得到我想要的文件,现在我正试图分析这些文件,然后将一个文件输出到每个文件夹中。我尝试了:fn='diff.nii'indir='/Users/sheena/Desktop/DTI'作为根目录,在os.walk(indir)中使用文件名:如果文件名中使用fn:flt=fsl.flir(bin=640,cost\u func='mutualinfo')flt.inputs.in文件='os.path.join(root,fn)'flt.inputs.output\u type=“NIFTI\u GZ”我收到一个错误,粘贴在下面。如有任何建议,我将不胜感激!非常感谢。TraitError:InputSpec实例的“in_file”特征必须是现有文件名,但指定了“os.path.join(root,fn)”值。不要在
    os.path.join…
    周围加引号,谢谢大家的评论。有了你的建议,我可以得到我想要的文件,现在我正试图分析这些文件,然后将一个文件输出到每个文件夹中。我尝试了:fn='diff.nii'indir='/Users/sheena/Desktop/DTI'作为根目录,在os.walk(indir)中使用文件名:如果文件名中使用fn:flt=fsl.flir(bin=640,cost\u func='mutualinfo')flt.inputs.in文件='os.path.join(root,fn)'flt.inputs.output\u type=“NIFTI\u GZ”我收到一个错误,粘贴在下面。如有任何建议,我将不胜感激!非常感谢。TraitError:InputSpec实例的“in_file”特征必须是现有文件名,但指定了“os.path.join(root,fn)”值。不要在
    os.path.join…
    doh很好的答案。。。OP应该接受这个+1,我不确定迭代文件名的想法directly@JoranBeasley除了那个多余的步骤,你的代码是正确的。但问题是,我已经回答了三次以上类似的问题,出于某种原因,许多人对
    root
    dirnames
    感到困惑,基本上是关于
    os.walk
    返回的内容。。。OP应该接受这个+1,我不确定迭代文件名的想法directly@JoranBeasley除了那个多余的步骤,你的代码是正确的。但问题是,我已经回答了三次以上类似的问题,出于某种原因,许多人对
    root
    dirnames
    感到困惑,基本上是对
    os.walk
    返回的内容感到困惑。