这是我的目录结构示例:https ://pastebin.com/XimFQdS7
假设有数千个子目录和文件,递归搜索所有带有“prj”扩展名的文件可能需要几秒钟。
假设我知道一个项目目录只包含一个“pjt”文件,我可以从搜索中丢弃它的所有子目录,从而节省大量时间。
这将是上述结构的所需输出:
[
'root/dir1/dirA/',
'root/dir1/dirB/',
'root/dir2/',
'root/dir3/dirA/dirX/',
'root/dir3/dirA/dirY/'
]
这是我当前的搜索代码:
def getSubDirectoriesContainingFileType(root, extension):
os.chdir(root)
fileFormat = '**/*.{}'.format(extension)
files = glob.glob(fileFormat, recursive = True)
matchingDirs = [os.path.dirname(os.path.abspath(file)) for file in files]
return matchingDirs
我使用了 glob,因为我发现它比 os.walk() 快一点,但我认为为了实现我上面所说的算法,我必须回到 os.walk()。
该算法的思想是:
def searchDirs(root):
dirs = []
for dir in rootDirs:
search for file with ext
if found:
append dir to dirs
else:
append searchDirs(dir) to dirs
return dirs
虽然我可以笨拙地实现这个算法,但我想知道是否有任何内置库已经提供了这个功能,以确保最大效率。