Обходите дерево каталогов через os.walk, а имена проверяйте fnmatch. Опционально печатайте посещаемую директорию и совпавшие файлы; по умолчанию не следуйте симлинкам каталогов.
Рекурсивный поиск файлов по шаблону с возможностью логирования
Обходите дерево каталогов через os.walk, а имена проверяйте fnmatch. Опционально печатайте посещаемую директорию и совпавшие файлы; по умолчанию не следуйте симлинкам каталогов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, которая принимает два аргумента: путь к директории и шаблон имени файлов. Функция должна возвращать список всех файлов, соответствующих шаблону, найденных в указанной директории и во всех её поддиректориях. Реализуйте опцию логирования, позволяющую выводить в консоль каждый посещаемый каталог и имена найденных файлов, если эта опция включена.
def find_files(root_path: str, pattern: str, log: bool = False) -> List[str]:
# реализация функции
pass
Ответ
Обходите дерево каталогов через os.walk, а имена проверяйте fnmatch. Опционально печатайте посещаемую директорию и совпавшие файлы; по умолчанию не следуйте симлинкам каталогов.
Пример с явной проверкой корня:
import os
import fnmatch
def find_files(root_path: str, pattern: str, log: bool = False) -> list[str]:
if not os.path.isdir(root_path):
raise NotADirectoryError(root_path)
result = []
def fail(error):
raise error
for directory, _, files in os.walk(root_path, onerror=fail, followlinks=False):
if log:
print('Directory:', directory)
for name in files:
path = os.path.join(directory, name)
if fnmatch.fnmatch(name, pattern) and os.path.isfile(path):
result.append(path)
if log:
print('File:', path)
return result
Шаблон применяется к имени, не к полному пути. Симлинки на файлы могут попасть в результат. Порядок обхода не гарантирован; при необходимости отсортируйте итог.