关于遍历目录树并返回包含单词“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)
谢谢!
答案 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
中的所有文件。因此,您要写出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")