Рекурсивный обход папок 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 шт):
Вместо continue вызываете себя же (gen_files_path), в качестве аргумента path использовав temp (как я понимаю, абсолютный путь, содержащий ещё и папку, в которой нужно пошариться)
Подумав, переписал функцию с помощью 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
]
Дальше просто цикл по результатам и прерывание после нахождения цели