【问题标题】:Using python os.walk how to check for directory name and only process those files (recursively) in the specific directory?使用 python os.walk 如何检查目录名称并仅处理特定目录中的那些文件(递归)?
【发布时间】:2020-09-30 14:40:34
【问题描述】:

我正在使用 os.walk 运行目录“foo”。我想处理 .dat 文件,但是如何检查目录名称并只处理特定目录?

如果 dir="bar" 则处理 files.dat。不要处理“notbar”。我可能错过了一些简单的东西

 C:\data\foo
       - notbar
           -123
             -file1.dat
           -456
             -file2.dat
             -file3.dat
       - bar
           -123
             -file1.dat
           -456
             -file2.dat
             -file3.dat

这会找到所有 .dat 文件....

    for (root, dirnames, filenames) in os.walk(base_path):
        print('Found directory: {0}'.format(root))
        for filename in filenames:
            if filename.endswith(".dat"):
                print(filename)

【问题讨论】:

  • os.walk(fbase_path + '/bar')?
  • 要添加到@juanpa.arrivillaga,使用os.walk(os.path.join(base_path, "bar")) 以兼容多个操作系统(windows 使用 \ 和 unix /,这不是我们的问题)
  • 这不是真正的选择,这是一个简化的例子。用户将指定一个根目录,而不是已知文件夹名称的路径。
  • @Seraf 我个人会推荐更好的pathlib 而不是os.path,所以它只是Path(base_path) / 'bar'
  • 嗯,那你可以先找到bar,然后从bar再走一遍

标签: python directory os.walk


【解决方案1】:

glob 非常适合这个。它返回所有匹配特定模式的文件。

模式有一个reference,但最有用的是:

  • * 匹配除路径斜杠以外的所有内容(\ 用于 windows,/ 用于 mac / linux)
  • ** 匹配零个或多个目录

在您的示例中,您希望在基本路径 base_path 内的子目录 (bar) 的任何子目录 (*) 中查找 .dat (*.dat) 文件。要获取这些文件,我们可以编写

from glob import glob

filenames = glob(base_path + "\\bar\\*\\*.dat")

跨平台最好使用os.path.join

from glob import glob

filenames = glob(os.path.join(base_path, "bar", "*", "*.dat"))

查看结果here

如果bar 不一定是base_path 的直接子目录,而是嵌套在更下方,则可以使用**

from glob import glob

filenames = glob(os.path.join(base_path, "**", "bar", "*", "*.dat"))

最后,glob 不一定会以任何顺序返回文件。要按字母顺序获取它们,请使用sorted(filenames)。要按修改后的顺序使用sorted(filenames, key=os.path.getmtime),按照this answer

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多