2

我有一个关于遍历目录树并返回所有包含“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")

我得到每个包含“测试”的目录。所以一些目录可能被命名为“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)

谢谢!

4

1 回答 1

1

我在这里猜测,但我认为通过说您想要“包含“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。所以,你要写出thing1andthing2两次,永远不要写出stuff1or 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")
于 2013-05-29T19:00:43.157 回答