Отображение пути к найденному рекурсивной функцией файлу
Написал простую функцию для поиска файлов на компьютере. Она работает, всё хорошо, но я не могу понять 2 момента, подскажите, будьте добры.
- Сейчас название файла я ввожу отдельно через "name", но если попытаться добавить name как один из обязательных параметров функции (рядом с path) и указывать его при вызове функции, то почему-то программа перестаёт давать результат.
- После срабатывания return функция должна прекращать свою работу, но она почему-то продолжает крутится и заполнять список миллионом файлов даже после того, как уже нашла нужный и return сработал. Как по-другому тогда можно прекратить её выполнение?
import os
spisok = []
name = input()
def poisk(path, level=1):
if name in os.listdir(path):
return print(spisok[-1])
for i in os.listdir(path):
if os.path.isdir(path+'\\'+i):
spisok.append(path + '\\' + i)
poisk(path + '\\' + i, level + 1)
poisk("D:\\Papka")
Ответы (2 шт):
Я бы посоветовал вам использовать os.walk, он более удобен в данном случае, т.к. сам заботится о рекурсивном проходе по директориям.
Вот функция, которая принимает на вход имя файла filename и путь для рекусивного поиска search_path.
def poisk(filename, search_path):
for dirpath, dirnames, filenames in os.walk(search_path):
if filename in filenames:
return os.path.join(dirpath, filename)
poisk(path + '\\' + i, level + 1)
Вы не проверяете, что возвращает рекурсивный вызов, и никак не реагируете на результат поиска, и поэтому функция продолжает работать на предыдущем уровне, даже не смотря, что на следующем вызове функции вы сделали return. Проверяйте, вернулся ли из функции результат. Если вернулся - снова делайте return, и так будет пока вся рекурсия не "размотается" и не произойдёт окончательный выход из функции к самому первому вызову.
ret = poisk(path + '\\' + i, level + 1)
if ret:
return ret