我是python的新手,我需要搜索一个名称为:vvl * cpp的文件夹,并且始终存在于名为test的目录中。但问题是测试目录的深度尚不清楚。
我试过了:
dir_name=glob.glob('./[a-z,_]*/test/vvl*cpp')
file_dict={}
for i in dir_name:
name=re.compile(r"\.\/[a-z,_]*\/test\/vvl_")
file_name=name.sub("",i)
file_dict[file_name]=i
for key in sorted(file_dict.iterkeys()):
print "%s: %s" % (key, file_dict[key])
但它只搜索子目录,但正如我所提到的,我不知道测试目录的深度。它可能是1它可能是10.请建议我一些出路。我正在使用python2.6
答案 0 :(得分:1)
如果您认为需要两个组件,这很简单:
第一个:
def walk_tree(path):
for root, dirs, files in os.walk(path):
for dir in dirs:
yield root, dir
对于第二个:
def is_a_match(dirparent, dirname):
return os.path.basename(dirparent) == "test" and \
dirname.startswith("vvl") and dirname.endswith("cpp")
现在把它们放在一起:
def iter_targets(path):
for dirparent, dirname in walk_tree(path):
if is_a_match(dirparent, dirname):
yield os.path.join(dirparent, dirname)
答案 1 :(得分:0)
我喜欢这段代码中的逻辑:
for myDir, myDirs, myFilenames in os.walk(myPath):
print type(myDir), myDir
print type(myDirs), myDirs
print type(myFilenames), myFilenames
您可以使用os.path方法来修复其余部分,例如:os.path.abspath(),os.path.dirname()等
答案 2 :(得分:0)
您可以使用os.walk()方法。
import os
folders = []
for path, dirs, files in os.walk(starting_path):
folders.append(path)
print path
答案 3 :(得分:0)
我会这样做 - 用os.walk
抓取树,用lambda
检查你的情况并用列表理解来累积匹配:
cond = lambda x, y: os.path.basename(x) == 'test' and
y.startswith('vvl') and y.endswith('cpp')
matches = (os.path.join(r, d) for r, d, f in os.walk(tree) if cond(r, d))
希望这就是你的意思,有点不清楚。