Есть ли способ вернуть список всех подкаталогов в текущем каталоге в Python?
Я знаю, что вы можете сделать это с файлами, но мне нужно получить список каталогов вместо этого.
python
directory
subdirectory
Брэд зейс
источник
источник
Ответы:
Вы имеете в виду непосредственные подкаталоги или каждый каталог прямо в дереве?
В любом случае, вы можете использовать
os.walk
для этого:выдаст кортеж для каждого подкаталога. Первая запись в 3-кортеже - это имя каталога, поэтому
должен дать вам все подкаталоги, рекурсивно.
Обратите внимание, что вторая запись в кортеже - это список дочерних каталогов записи в первой позиции, так что вы можете использовать ее вместо этого, но вряд ли это сильно вас спасет.
Однако вы можете использовать его просто для того, чтобы дать вам непосредственные дочерние каталоги:
Или посмотрите другие решения, уже опубликованные, использующие
os.listdir
иos.path.isdir
, в том числе, те, что приведены в разделе « Как получить все непосредственные подкаталоги в Python ».источник
os.walk('.').next()[1]
илиos.walk('.').__next__()[1]
напрямую. Вместо этого используйте встроенную функциюnext()
, которая доступна как в Python 2 (см. Документ), так и в Python 3 (см. Документ) . Например:next(os.walk('.'))[1]
.os.walk('.').next()[1]
напрямую?iteraror.__next__()
это внутренний метод иiterator.next()
использование должно быть переведено на встроенный вnext()
соответствии с PEP-3114. См. PEP-3114, который был утвержден в 2007 году.os.walk
иos.listdir
+os.path.isdir
: я только что протестировал каталог с 10 000 подкаталогов (с миллионами файлов в иерархии ниже), и различия в производительности незначительны.os.walk
: «10 циклов, лучшее из 3: 44,6 мсек на цикл» иos.listdir
+os.path.isdir
: «10 циклов, лучшее из 3: 45,1 мсек на цикл»источник
os.path.join
на ,o
чтобы получить полный путь, в противном случаеisdir(0)
всегда будет возвращать ложьos.path.join
дважды, вы можете сначала присоединиться, а затем отфильтровать список, используяos.path.isdir
:filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
Вы могли бы просто использовать
glob.glob
Не забывайте отставать
/
после*
.источник
/
/
себя разделителем папок, сделайте следующее:glob(os.path.join(path_to_directory, "*", ""))
recursive=True
Намного приятнее, чем выше, потому что вам не нужно несколько os.path.join () и вы получите полный путь напрямую (если хотите), вы можете сделать это в Python 3.5 и выше.
Это даст полный путь к подкаталогу. Если вы хотите только имя подкаталога, используйте
f.name
вместоf.path
https://docs.python.org/3/library/os.html#os.scandir
Немного OT: В случае, если вам нужны все подпапки рекурсивно и / или все файлы рекурсивно , взгляните на эту функцию, которая работает быстрее
os.walk
&glob
и вернет список всех подпапок, а также всех файлов в этих (подпапках) подпапках: https://stackoverflow.com/a/59803793/2441026В случае, если вы хотите рекурсивно только все подпапки :
Возвращает список всех подпапок с их полными путями. Это снова быстрее
os.walk
и намного быстрее, чемglob
.Анализ всех функций
tl; dr:
- Если вы хотите получить все непосредственные подкаталоги для использования в папке
os.scandir
.- Если вы хотите получить все подкаталоги, даже вложенные , используйте
os.walk
или - чуть быстрее -fast_scandir
указанную выше функцию.- Никогда не используйте
os.walk
только для подкаталогов верхнего уровня, так как это может быть в сотни (!) Раз медленнее, чемos.scandir
.os.walk
будет базовая папка. Так что вы не получите только подкаталоги. Вы можете использовать,fu.pop(0)
чтобы удалить его.Результаты :
Протестировано с W7x64, Python 3.8.1.
источник
Если вам нужно рекурсивное решение, которое найдет все подкаталоги в подкаталогах, используйте walk, как предлагалось ранее.
Если вам нужны только дочерние каталоги текущего каталога, объедините
os.listdir
сos.path.isdir
источник
Я предпочитаю использовать фильтр ( https://docs.python.org/2/library/functions.html#filter ), но это всего лишь вопрос вкуса.
источник
Реализовал это используя python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
источник
Вы можете получить список подкаталогов (и файлов) в Python 2.7, используя os.listdir (путь)
источник
os.listdir
список содержимого каталога, включая файлы.Перечисление только каталогов
Перечисление только файлов в текущем каталоге
источник
Python 3.4 вводится в
pathlib
модуле в стандартную библиотеку, которая обеспечивает объектно - ориентированный подход для обработки файловой системы путей:Pathlib также доступен на Python 2.7 через модуль pathlib2 на PyPi.
источник
for f in filter(Path.is_dir, p.iterdir()):
Поскольку я столкнулся с этой проблемой, используя пути Python 3.4 и Windows UNC, вот вариант для этой среды:
Pathlib является новым в Python 3.4 и значительно упрощает работу с путями в разных ОС: https://docs.python.org/3.4/library/pathlib.html
источник
Хотя на этот вопрос давно ответили. Я хочу порекомендовать использовать
pathlib
модуль, так как это надежный способ работы в ОС Windows и Unix.Итак, чтобы получить все пути в определенном каталоге, включая подкаталоги:
и т.п.
источник
Спасибо за советы ребята. Я столкнулся с проблемой с программными ссылками (бесконечная рекурсия), возвращаемыми как dirs. Softlinks? Мы не хотим никаких вонючих мягких ссылок! Так...
Это делает только каталоги, а не программные ссылки:
источник
[x[0] for x in inf]
называется в Python, чтобы я мог посмотреть?Скопируйте и вставьте в
ipython
:Выход из
print(folders)
:источник
x
- это элемент из списка, созданный,os.listdir(d)
потому чтоlistdir
он возвращает файлы и папки, с которыми он используетfilter
командуos.path.isdir
для фильтрации любых файлов из списка.Вот как я это делаю.
источник
Вот пара простых функций, основанных на примере @Blair Conrad:
источник
Опираясь на решение Эли Бендерского, используйте следующий пример:
где
<your_directory>
путь к каталогу, который вы хотите пройти.источник
С полным путем и учетом путем бытия
.
,..
,\\
,..\\..\\subfolder
и т.д.:источник
Этот ответ, кажется, уже не существует.
источник
У меня недавно был похожий вопрос, и я узнал, что лучший ответ для python 3.6 (как добавил пользователь havlock) - это использовать
os.scandir
. Поскольку кажется, что нет решения с его использованием, я добавлю свое. Во-первых, нерекурсивное решение, которое перечисляет только подкаталоги непосредственно в корневом каталоге.Рекурсивная версия будет выглядеть так:
имейте ввиду, что
entry.path
владеет абсолютным путем к подкаталогу. Если вам нужно только имя папки, вы можете использоватьentry.name
вместо этого. Обратитесь к os.DirEntry для получения дополнительной информации обentry
объекте.источник
использовать функцию фильтра
os.path.isdir
надos.listdir()
чем-то вроде этогоfilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
источник
Это перечислит все подкаталоги прямо в дереве файлов.
pathlib
новое в версии 3.4источник
Функция для возврата списка всех подкаталогов в указанном пути к файлу. Будет искать по всему дереву файлов.
источник
мы можем получить список всех папок с помощью os.walk ()
этот pathObject является объектом, и мы можем получить массив
Мы можем получить список всех подкаталогов, перебирая arr и печатая средний массив
Это напечатает все подкаталоги.
Чтобы получить все файлы:
источник
Эта функция с данным родителем рекурсивно
directory
перебирает все своиdirectories
иprints
все,filenames
что внутри нее. Слишком полезноисточник
Присоединяясь к нескольким решениям, я использовал это:
источник