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

时间:2013-05-29 18:46:06

标签: python regex for-loop tree os.walk

关于遍历目录树并返回包含单词“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)

谢谢!

1 个答案:

答案 0 :(得分:2)

我在这里猜测,但我想通过说你想要的目录'包含“test”这个词,但不希望目录'命名为“systest”或“testplan”',你在寻找将名称拆分为单词,然后查看其中一个单词是"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中的所有文件。因此,您要写出thing1thing2两次,绝不写出stuff1stuff2

我猜你实际想要做的是这样做:

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