首页 > 解决方案 > 使用 python os.walk 如何检查目录名称并仅处理特定目录中的那些文件(递归)?

问题描述

我正在使用 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)

标签: pythondirectoryos.walk

解决方案


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

这些模式有一个参考,但最有用的是:

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

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

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"))

在这里查看结果

如果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)按照这个答案让它们按修改顺序使用。


推荐阅读