下面是我的目录结构示例: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
虽然我可以笨拙地实现这个算法,但我想知道是否有任何内置库已经提供了这个功能,以确保最大的效率
使用Path.rglob
输出:
我发现你的问题很有趣,所以我做了一些测试。比较来自glob的原始结果,而不过滤不需要的子目录,并使用特定搜索功能搜索想要的结果
似乎特定搜索的速度是的两倍左右,无需进一步处理即可得到所需的结果
我认为诀窍在于
1如果找到prj文件,立即停止循环
2在同一循环中同时搜索子目录和prj文件
结果
相关问题 更多 >
编程相关推荐