Skip to main content
 首页 » 编程设计

python之使用 python 的 os.walk 来搜索特定的目录名称

2025年05月04日10myhome

我有一个关于遍历目录树并返回所有包含单词“test”的目录的问题。我的问题是当我运行这段代码时,

for root,dirnames,filenames in os.walk("Path/to/my/files"): 
    for dirname in fnmatch.filter(dirnames, "test"): 
        for filename in fnmatch.filter(filenames, "*.ext"): 
            file.write(os.path.join(root,filename)+ "\n") 

我得到了包含“test”的每个目录。所以一些目录可能被命名为“systest”或“testplan”或“tester”。我不想要那些目录。我知道我应该使用正则表达式或类似的东西,但我似乎无法全神贯注。感谢您的帮助。

更新:

我想出了另一种使用正则表达式的方法,但由于 Windows 中的文件分隔符,它有点不稳定

testPattern = re.compile(".*\\\\test\\\.*\.java") 
for root,dirnames,filenames in os.walk(rootPath): 
    for file in filenames: 
        path = root+"\\"+file 
        m = testPattern.match(path) 

谢谢!

请您参考如下方法:

我在这里进行猜测,但我想通过说您想要“包含单词”测试“但不希望目录”命名为“系统测试”或“测试计划””的目录,您正在寻找将名称拆分成单词,然后查看其中一个单词是否是 "test"。

这很简单:

for dirname in dirnames: 
    if "test" in dirname.split(): 
        # ... 

但我认为您的逻辑无论如何都说不通。例如,假设您有这样的结构:

foo/ 
|---a test/ 
|   |--- stuff1.ext 
|---another test/ 
|   |--- stuff2.ext 
|---thing1.ext 
|---thing2.ext 

在第一步 walk 中,您将遍历 foo 中的所有子目录,并且对于每个子目录都有 test 在他们的名字中,你将遍历 foo 中的所有文件。所以,你要写出 thing1 和 thing2 两次,永远不要写出 stuff1 或 stuff2。

我猜你实际上想做的是:

for root,dirnames,filenames in os.walk("Path/to/my/files"): 
    if "test" in os.basename(root).split(): 
        for filename in fnmatch.filter(filenames, "*.ext"): 
            file.write(os.path.join(root,filename)+ "\n")