Отображение пути к найденному рекурсивной функцией файлу

Рейтинг: 0Ответов: 2Опубликовано: 12.04.2023

Написал простую функцию для поиска файлов на компьютере. Она работает, всё хорошо, но я не могу понять 2 момента, подскажите, будьте добры.

  1. Сейчас название файла я ввожу отдельно через "name", но если попытаться добавить name как один из обязательных параметров функции (рядом с path) и указывать его при вызове функции, то почему-то программа перестаёт давать результат.
  2. После срабатывания 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")

Ответы

▲ 0

Я бы посоветовал вам использовать 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)

▲ 0
poisk(path + '\\' + i, level + 1)

Вы не проверяете, что возвращает рекурсивный вызов, и никак не реагируете на результат поиска, и поэтому функция продолжает работать на предыдущем уровне, даже не смотря, что на следующем вызове функции вы сделали return. Проверяйте, вернулся ли из функции результат. Если вернулся - снова делайте return, и так будет пока вся рекурсия не "размотается" и не произойдёт окончательный выход из функции к самому первому вызову.

ret = poisk(path + '\\' + i, level + 1)
if ret:
    return ret