Рекурсивный обход папок c генерацией пути встреченных файлов

Есть один класс gen_files_path. Туда передается название искомой папки и путь. Если путь не указан, то корневой диск.

Процесс: обход указанного каталога, если элемент файл, генерировать путь к нему. Если папка, то то внутри неё обойти, генерируя пути файлов, если в ней пака... т.д. При нахождении искомой папки, печатать её путь и строку 'найдено' и завершать обход.

Вопрос следующий: не могу понять как дописать туда рекурсивный обход папок.

код:

import os
from _collections_abc import Iterable


def gen_files_path(folder: str, path=None) ->Iterable[str]:
    if path is None:
        path = os.path.abspath(os.path.join(os.path.sep))
    for i_elem in os.listdir(path):
        temp = os.path.abspath(os.path.join(path, i_elem))
        if os.path.isdir(temp) and i_elem != folder:
            continue
        yield temp
        if i_elem == folder:
            return

Ответы (2 шт):

Автор решения: MBo

Вместо continue вызываете себя же (gen_files_path), в качестве аргумента path использовав temp (как я понимаю, абсолютный путь, содержащий ещё и папку, в которой нужно пошариться)

→ Ссылка
Автор решения: Misato Katsuragi

Подумав, переписал функцию с помощью os.walk()

Решение берёт из кортежа, возвращаемого os.walk() ссылку link, с именем файла file, соединяет в строку и возвращает с помощью yield. При следующем обращении, разделяет ссылку split('\') и проверяет, совпадает ли имя последней папки с искомым. Если совпадает, то прерываем цикл.

def gen_files_path(link: str, search: str) -> Iterable[str]:
for link, dirs, files in list(os.walk(link)):
    for file in files:
        yield links + '\\' + file
        if links.split('\\')[-1] == search:
            return 

Но потом ещё подумала и написал выражение:

gen_files_path = [links + '\\' + file
              for links, dirs, files in list(os.walk(folder))
              for file in files
              ]

Дальше просто цикл по результатам и прерывание после нахождения цели

→ Ссылка