Получение подкаталогов Python: исключаем и копируем файлы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для получения списка непосредственных подкаталогов, можно использовать следующий код:

Python
Скопировать код
import os
subdirs = [d for d in os.listdir('.') if os.path.isdir(d)]

Здесь мы используем функцию os.listdir('.') для перечисления контента текущего каталога ('.'). Функция os.path.isdir() проверяет, является ли элемент каталогом, после чего мы собираем список названий подкаталогов.

Кинга Идем в IT: пошаговый план для смены профессии

Использование мощи os.scandir() для получения списка подкаталогов

Хотя функция os.listdir() неплоха в своем роде, os.scandir() предлагает больше производительности и удобства. Для объемных каталогов os.scandir() работает быстрее благодаря своему итератору, который возвращает объекты DirEntry:

Python
Скопировать код
subdirs = [entry.name for entry in os.scandir('.') if entry.is_dir()]

Функция os.scandir() также облегчает исключение определённых каталогов:

Python
Скопировать код
# Исключаем нежелательные каталоги
ignored_dirs = {'ignore_this', 'and_this'}
subdirs = [entry.name for entry in os.scandir('.') if entry.is_dir() and entry.name not in ignored_dirs]

Поиск каталогов с использованием шаблонов через Glob

Не оставляйте без внимания мощь кода '*', который особенно эффективен в сочетании с модулем glob:

Python
Скопировать код
import glob
subdirs = glob.glob('*/')

Шаблон */ означает, что нас интересуют только каталоги.

Обход дерева каталогов с использованием os.walk()

Для обхода иерархии каталогов можно использовать os.walk(). Однако если вам нужны лишь непосредственные подкаталоги, используйте next():

Python
Скопировать код
subdirs = next(os.walk('.'))[1]

Таким образом, мы получаем непосредственные подкаталоги текущего каталога, не забираясь в дебри файловой системы, как это делает os.walk() полностью.

Визуализация

Эту задачу можно сравнить с просмотром помещений на первом уровне в доме:

Markdown
Скопировать код
🏠
├── 🛏 Спальня
├── 🍳 Кухня
└── 🛋 Гостиная
Python
Скопировать код
import os

for entry in os.listdir('путь_к_дому'):
    if os.path.isdir(os.path.join('путь_к_дому', entry)):
        print(entry)

В этом примере os.listdir() открывает дверь, а os.path.isdir() проверяет, является ли пространство за ней комнатой. Это помогает избежать попадания в ненужные места и не заблудиться по дому.

Сортировка и соответствие шаблонам списка каталогов

Иногда порядок имеет значение. Можно упорядочить каталоги по времени последнего обновления или алфавиту с помощью функции sorted():

Python
Скопировать код
subdirs = sorted(subdirs, key=lambda d: os.path.getmtime(os.path.join('.', d)))
Python
Скопировать код
import natsort
subdirs = natsort.natsorted(subdirs)

Для фильтрации по шаблону можно использовать модули glob и fnmatch:

Python
Скопировать код
import fnmatch

# Фильтруем нежелательные каталоги по шаблону
patterns_to_exclude = ['temp*', '*.bak']
subdirs = [d for d in os.listdir('.') if os.path.isdir(d) 
           and not any(fnmatch.fnmatch(d, pattern) for pattern in patterns_to_exclude)]

Создание продвинутых скриптов с помощью инструментов Python для работы с каталогами

Сочетая перечисленные выше техники, можно создавать мощные скрипты на Python для автоматизации работы с файловыми системами:

Python
Скопировать код
import shutil

def copy_to_subdirs(file, target_dirs):
    for subdir in target_dirs:
        shutil.copy(file, os.path.join(subdir, file))

# Выбираем любой из обсуждаемых ранее методов получения списка подкаталогов
subdirs = get_immediate_subdirectories('.')
copy_to_subdirs('report.txt', subdirs)

Полезные материалы

  1. os — Многофункциональные интерфейсы ОС — Документация Python 3.12.2 — изучите официальную документацию для os.listdir.
  2. file – Как получить все непосредственные подкаталоги в Python – Stack Overflow — обсуждение опыта сообщества и практические примеры.
  3. os — Многофункциональные интерфейсы ОС — Документация Python 3.12.2 — подробное описание os.scandir(), изюминки инструментов для работы с каталогами.
  4. os.path — Универсальные методы работы с путями файлов — Документация Python 3.12.2 — освоение методик работы с путями файлов для навигации по каталогам.
  5. Python | Метод os.scandir() – GeeksforGeeks – изучение преимуществ и недостатков os.scandir() в сравнении с os.walk().
  6. python – Как использовать Glob для рекурсивного поиска файлов? – Stack Overflow — использование модуля glob для гибкого поиска в каталогах.
  7. pathlib — Объектно-ориентированные пути в файловой системе — Документация Python 3.12.2 — введение в модуль pathlib для объектно-ориентированной работы с файловыми системами.