tak.lol

Поиск файлов в папках и подпапках

Использование рекурсивных алгоритмов, таких как os.walk в Python, позволяет эффективно обходить директории и поддиректории, обеспечивая гибкость в фильтрации файлов по различным критериям

Частенько нужно сканировать папки и подпапки в поисках нужных файлов для дальнейших манипуляций с ними. Решил сохранить заготовку, которая выполняет это действие и возвращает список найденных файлов:


Функция сканирования:

Параметры:
directory: строка, указывающая путь к директории, в которой будет происходить поиск.

pattern: строка (по умолчанию '*'), указывающая шаблон для фильтрации имен файлов. Звездочка (*) означает, что будут выбраны все файлы.


def scan_directory(directory, pattern='*'):
    file_list = []
    
    # Проходим по всем папкам и файлам в указанной директории
    for root, dirs, files in os.walk(directory):
        for file in fnmatch.filter(files, pattern):
            # Формируем полный путь к файлу
            full_path = os.path.join(root, file)
            # Добавляем в список
            file_list.append(full_path)
    
    return file_list


Логика работы функции:


1. Инициализация списка:
file_list = []


Создается пустой список file_list, который будет использоваться для хранения полных путей к найденным файлам.

2. Проход по директориям:
for root, dirs, files in os.walk(directory):


Используется функция os.walk, которая рекурсивно обходит все подкаталоги и файлы в указанной директории. Она возвращает кортежи из трех элементов:
• root: текущая директория.
• dirs: список подкаталогов в текущей директории.
• files: список файлов в текущей директории.

3. Фильтрация файлов по шаблону:
for file in fnmatch.filter(files, pattern):


Здесь используется функция fnmatch.filter, которая фильтрует список файлов (files) на основе заданного шаблона (pattern). Например, если шаблон — это *.txt, то будут выбраны только файлы с расширением .txt.

4. Формирование полного пути к файлу:

 full_path = os.path.join(root, file)


Для каждого найденного файла создается его полный путь с помощью функции os.path.join, которая корректно объединяет директорию (root) и имя файла (file).

5. Добавление полного пути в список:
file_list.append(full_path)


Полный путь к файлу добавляется в список file_list.

6. Возврат результата:

return file_list


После завершения обхода всех директорий функция возвращает список всех найденных файлов, соответствующих заданному шаблону.


Простой пример использования:
import os
import fnmatch

def scan_directory(directory, pattern='*'):
    file_list = []
    
    # Проходим по всем папкам и файлам в указанной директории
    for root, dirs, files in os.walk(directory):
        for file in fnmatch.filter(files, pattern):
            # Формируем полный путь к файлу
            full_path = os.path.join(root, file)
            # Добавляем в список
            file_list.append(full_path)
    
    return file_list

# Пример использования
directory_to_scan = 'путь к папке'  # Замените на путь к вашей директории
file_pattern = '*.png'  # Замените на нужную маску, например, '*.txt' для текстовых файлов
files = scan_directory(directory_to_scan, file_pattern)

# Выводим список файлов
for f in files:
    print(f)


Дальше уже с каждым файлом можно осуществлять всякие всячины.
Комментарии к материалу
Комментировать
Ваш комментарий: