【问题标题】:How do I iterate through folders to find particular files in Python?如何遍历文件夹以查找 Python 中的特定文件?
【发布时间】:2016-04-26 21:46:44
【问题描述】:

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

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

代替分析代码,我只是尝试在第一个实例中打印文件。理想情况下,我会在每个子文件夹S1S2S3 下看到一个名为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)

【问题讨论】:

  • 关于“不起作用”的任何进展
  • 您需要提供更多信息,说明问题实际是什么,您尝试了什么,以及什么失败了。否则很容易被关闭。

标签: python


【解决方案1】:

如果您尝试检查某个文件名,则应在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))

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

【讨论】:

  • 不错的答案...而且 OP 可能应该接受这个 +1 我不确定我在想什么直接迭代文件名
  • @JoranBeasley 除了那个多余的步骤,您的代码是正确的。但问题是我在 SO 上回答了超过 3 次类似的问题,出于某种原因,很多人对 rootdirnames 感到困惑,基本上是关于 os.walk 返回的内容。
【解决方案2】:

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

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 [] []

所以

  1. "os.walk" 可能没有按照您的预期执行,它正在遍历所有子目录和子目录的子目录(但这对您的代码来说不是问题,可能只是更智能/更快方法)
  2. 所有文件都在“文件名”列表中 - 所以您遍历了错误的列表!当“root”是“blah/S1”、“blah/S2”或“blah/S3”时,“hi.txt”在“文件名”列表中。

【讨论】:

    【解决方案3】:
    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)
    

    可能会好一点

    【讨论】:

    • 谢谢大家的cmets。根据您的建议,我能够找到我想要的文件,现在我正在尝试分析这些文件,然后将文件输出到每个文件夹中。我试过: fn = 'diff.nii' indir = '/Users/sheena/Desktop/DTI' for root, _, os.walk(indir) 中的文件名:如果文件名中的 fn:flt = fsl.FLIRT(bins=640 , cost_func='mutualinfo') flt.inputs.in_file = 'os.path.join(root,fn)' flt.inputs.output_type = "NIFTI_GZ" 我收到一个错误,粘贴在下面。我将不胜感激任何建议!谢谢!!
    • TraitError: FLIRTInputSpec 实例的 'in_file' 特征必须是现有文件名,但指定了 'os.path.join(root,fn)' 的值.
    • 不要在os.path.join...周围加上引号
    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 2021-02-26
    • 2014-03-02
    • 2019-05-08
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多