Получение списка всех подкаталогов в текущем каталоге - PullRequest
413 голосов
/ 10 июня 2009

Есть ли способ вернуть список всех подкаталогов в текущем каталоге в Python?

Я знаю, что вы можете сделать это с файлами, но вместо этого мне нужно получить список каталогов.

Ответы [ 23 ]

472 голосов
/ 10 июня 2009

Вы имеете в виду непосредственные подкаталоги или каждый каталог вниз по дереву?

В любом случае, вы можете использовать os.walk для этого:

os.walk(directory)

даст кортеж для каждого подкаталога. Первая запись в 3-кортеже - это имя каталога, поэтому

[x[0] for x in os.walk(directory)]

должен дать вам все подкаталоги, рекурсивно.

Обратите внимание, что вторая запись в кортеже - это список дочерних каталогов записи в первой позиции, так что вы можете использовать ее вместо этого, но вряд ли это сильно вас спасет.

Однако вы можете использовать его просто для того, чтобы дать вам непосредственные дочерние каталоги:

next(os.walk('.'))[1]

Или посмотрите другие решения, уже опубликованные, используя os.listdir и os.path.isdir, включая те, что в " Как получить все непосредственные подкаталоги в Python ».

140 голосов
/ 10 июня 2009
import os

d = '.'
[os.path.join(d, o) for o in os.listdir(d) 
                    if os.path.isdir(os.path.join(d,o))]
112 голосов
/ 05 апреля 2016

Вы можете просто использовать glob.glob

from glob import glob
glob("/path/to/directory/*/")

Не забудьте оставить след / после *.

54 голосов
/ 31 октября 2016

Намного приятнее, чем выше, потому что вам не нужно несколько os.path.join () и вы получите полный путь напрямую (если хотите), вы можете сделать это в Python 3.5 +

subfolders = [f.path for f in os.scandir(folder) if f.is_dir() ]    

Это даст полный путь к подкаталогу. Если вам нужно только имя подкаталога, используйте f.name вместо f.path

https://docs.python.org/3/library/os.html#os.scandir

36 голосов
/ 10 июня 2009

Если вам нужно рекурсивное решение, которое найдет все подкаталоги в подкаталогах, используйте walk, как предлагалось ранее.

Если вам нужны только дочерние каталоги текущего каталога, объедините os.listdir с os.path.isdir

27 голосов
/ 10 сентября 2015

Я предпочитаю использовать фильтр (https://docs.python.org/2/library/functions.html#filter),, но это всего лишь вопрос вкуса.

d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
23 голосов
/ 26 сентября 2013

Реализовано это с помощью python-os-walk. (http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/)

import os

print("root prints out directories only from what you specified")
print("dirs prints out sub-directories from root")
print("files prints out all files from root and directories")
print("*" * 20)

for root, dirs, files in os.walk("/var/log"):
    print(root)
    print(dirs)
    print(files)
18 голосов
/ 07 октября 2014

Вы можете получить список подкаталогов (и файлов) в Python 2.7, используя os.listdir (путь)

import os
os.listdir(path)  # list of subdirectories and files
12 голосов
/ 30 августа 2016

Список только каталогов

print("\nWe are listing out only the directories in current directory -")
directories_in_curdir = filter(os.path.isdir, os.listdir(os.curdir))
print(directories_in_curdir)

Вывод списка только файлов в текущем каталоге

files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)
9 голосов
/ 10 ноября 2014

Поскольку я наткнулся на эту проблему, используя пути Python 3.4 и UNC Windows, вот вариант для этой среды:

from pathlib import WindowsPath

def SubDirPath (d):
    return [f for f in d.iterdir() if f.is_dir()]

subdirs = SubDirPath(WindowsPath(r'\\file01.acme.local\home$'))
print(subdirs)

Pathlib является новым в Python 3.4 и значительно облегчает работу с путями в разных ОС: https://docs.python.org/3.4/library/pathlib.html

...