Вот пример моей структуры каталогов: 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 () но я думаю, что для реализации алгоритма, о котором я говорю выше, мне пришлось бы go вернуться к 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
Хотя я мог бы неуклюже реализовать этот алгоритм, мне интересно, предоставляет ли уже какая-либо из встроенных библиотек эту функцию, чтобы обеспечить максимальную эффективность.