2013-05-29 52 views
3

我有一个问题关于遍历目录树并返回包含单词“test”的所有目录。我的问题是当我用这段代码运行时,我得到每个包含“测试”的目录。所以一些目录可能被命名为“systest”或“testplan”或“tester”。我不想要这些目录。我知道我应该使用正则表达式或类似的东西,但我似乎无法绕过它。谢谢您的帮助。使用python的os.walk搜索特定的目录名称?

UPDATE:

我想通另一种方式与正则表达式来做到这一点,但在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

我认为OP希望匹配'r'^ test $''的目录不匹配'r'test'' –

+0

'匹配'r'^ test $''可能更简单地写成'=='test' ',特别是对于那些不能将自己的想法包装在正则表达式中的OP,但我不认为这就是他的意思,我认为他的意思是在dirname.split()中用'test'。 – abarnert

回答

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

你需要使用root.split(os.sep)? –

+0

@PeterdeRivaz:'root.split(os.sep)'不比'root.split('\\')'好得多。'os.path '是让你把路径当作路径,而不是字符串,使用'os.path.split'或者在这个例子中是'os.basename'。但是,谢谢你指出我没有做任何以上。 – abarnert

相关问题