Получение подкаталогов Python: исключаем и копируем файлы
Быстрый ответ
Для получения списка непосредственных подкаталогов, можно использовать следующий код:
import os
subdirs = [d for d in os.listdir('.') if os.path.isdir(d)]
Здесь мы используем функцию os.listdir('.')
для перечисления контента текущего каталога ('.'
). Функция os.path.isdir()
проверяет, является ли элемент каталогом, после чего мы собираем список названий подкаталогов.
Использование мощи os.scandir() для получения списка подкаталогов
Хотя функция os.listdir()
неплоха в своем роде, os.scandir()
предлагает больше производительности и удобства. Для объемных каталогов os.scandir()
работает быстрее благодаря своему итератору, который возвращает объекты DirEntry
:
subdirs = [entry.name for entry in os.scandir('.') if entry.is_dir()]
Функция os.scandir()
также облегчает исключение определённых каталогов:
# Исключаем нежелательные каталоги
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
:
import glob
subdirs = glob.glob('*/')
Шаблон */
означает, что нас интересуют только каталоги.
Обход дерева каталогов с использованием os.walk()
Для обхода иерархии каталогов можно использовать os.walk()
. Однако если вам нужны лишь непосредственные подкаталоги, используйте next()
:
subdirs = next(os.walk('.'))[1]
Таким образом, мы получаем непосредственные подкаталоги текущего каталога, не забираясь в дебри файловой системы, как это делает os.walk()
полностью.
Визуализация
Эту задачу можно сравнить с просмотром помещений на первом уровне в доме:
🏠
├── 🛏 Спальня
├── 🍳 Кухня
└── 🛋 Гостиная
import os
for entry in os.listdir('путь_к_дому'):
if os.path.isdir(os.path.join('путь_к_дому', entry)):
print(entry)
В этом примере os.listdir()
открывает дверь, а os.path.isdir()
проверяет, является ли пространство за ней комнатой. Это помогает избежать попадания в ненужные места и не заблудиться по дому.
Сортировка и соответствие шаблонам списка каталогов
Иногда порядок имеет значение. Можно упорядочить каталоги по времени последнего обновления или алфавиту с помощью функции sorted()
:
subdirs = sorted(subdirs, key=lambda d: os.path.getmtime(os.path.join('.', d)))
import natsort
subdirs = natsort.natsorted(subdirs)
Для фильтрации по шаблону можно использовать модули glob
и fnmatch
:
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 для автоматизации работы с файловыми системами:
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)
Полезные материалы
- os — Многофункциональные интерфейсы ОС — Документация Python 3.12.2 — изучите официальную документацию для
os.listdir
. - file – Как получить все непосредственные подкаталоги в Python – Stack Overflow — обсуждение опыта сообщества и практические примеры.
- os — Многофункциональные интерфейсы ОС — Документация Python 3.12.2 — подробное описание
os.scandir()
, изюминки инструментов для работы с каталогами. - os.path — Универсальные методы работы с путями файлов — Документация Python 3.12.2 — освоение методик работы с путями файлов для навигации по каталогам.
- Python | Метод os.scandir() – GeeksforGeeks – изучение преимуществ и недостатков
os.scandir()
в сравнении сos.walk()
. - python – Как использовать Glob для рекурсивного поиска файлов? – Stack Overflow — использование модуля
glob
для гибкого поиска в каталогах. - pathlib — Объектно-ориентированные пути в файловой системе — Документация Python 3.12.2 — введение в модуль pathlib для объектно-ориентированной работы с файловыми системами.