Есть ли способ вернуть список всех подкаталогов в текущем каталоге в Python?
Я знаю, что вы можете делать это с файлами, но мне нужно получить список каталогов.
Есть ли способ вернуть список всех подкаталогов в текущем каталоге в Python?
Я знаю, что вы можете делать это с файлами, но мне нужно получить список каталогов.
Вы имеете в виду немедленные подкаталоги или каждый каталог прямо вниз по дереву?
В любом случае вы можете использовать os.walk, чтобы сделать это:
os.walk(directory)
даст кортеж для каждого подкаталога. Первая запись в 3-кортеже - это имя каталога, поэтому
[x[0] for x in os.walk(directory)]
должен дать вам все подкаталоги, рекурсивно.
Обратите внимание, что вторая запись в кортеже - это список дочерних каталогов записи в первой позиции, поэтому вы можете использовать это вместо этого, но это вряд ли сэкономит вам много.
Однако вы можете использовать его только для предоставления вам непосредственных дочерних каталогов:
next(os.walk('.'))[1]
Или посмотрите другие опубликованные решения, используя os.listdir и os.path.isdir, в том числе в Как получить все непосредственные подкаталоги в Python.
import os
d = '.'
[os.path.join(d, o) for o in os.listdir(d) 
                    if os.path.isdir(os.path.join(d,o))]
Вы можете просто использовать glob.glob
from glob import glob
glob("/path/to/directory/*/")
Не забывайте о конце / после *.
Намного лучше, чем выше, потому что вам не нужно несколько os.path.join(), и вы получите полный путь напрямую (если хотите), вы можете сделать это в Python 3.5 +
subfolders = [f.path for f in os.scandir(folder) if f.is_dir() ]    
Это даст полный путь к подкаталогу.
Если вы хотите, чтобы имя подкаталога использовало f.name вместо f.path
Если вам нужно рекурсивное решение, которое найдет все подкаталоги в подкаталогах, используйте walk, как было предложено ранее.
Если вам нужны только текущие каталоги дочерних каталогов, объедините os.listdir с os.path.isdir
Я предпочитаю использовать фильтр (https://docs.python.org/2/library/functions.html#filter), но это только вопрос вкуса.
d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
Реализовал это используя 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)
Вы можете получить список подкаталогов (и файлов) в Python 2.7 с помощью os.listdir(path)
import os
os.listdir(path)  # list of subdirectories and files
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)
Так как я наткнулся на эту проблему, используя пути Python 3.4 и Windows UNC, здесь вариант для этой среды:
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
 Хотя на этот вопрос давно ответили. Я хочу порекомендовать использовать модуль  pathlib поскольку это надежный способ работы в ОС Windows и Unix.
Итак, чтобы получить все пути в определенном каталоге, включая подкаталоги:
from pathlib import Path
paths = list(Path('myhomefolder', 'folder').glob('**/*.txt'))
# all sorts of operations
file = paths[0]
file.name
file.stem
file.parent
file.suffix
и т.п.
Спасибо за советы, ребята. Я столкнулся с проблемой, когда softlinks (бесконечная рекурсия) возвращаются как dirs. Softlinks? Мы не хотим никаких бесплатных ссылок! Так что...
Это отображалось только в каталогах, а не в программных ссылках:
>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
 Python 3.4 ввел модуль pathlib в стандартную библиотеку, которая обеспечивает объектно-ориентированный подход для обработки путей в файловой системе:
from pathlib import Path
p = Path('./')
# List comprehension
[f for f in p.iterdir() if f.is_dir()]
# The trailing slash to glob indicated directories
# This will also include the current directory '.'
list(p.glob('**/'))
Pathlib также доступен на Python 2.7 через модуль pathlib2 на PyPi.
Основываясь на решении Эли Бендерски, используйте следующий пример:
import os
test_directory = <your_directory>
for child in os.listdir(test_directory):
    test_path = os.path.join(test_directory, child)
    if os.path.isdir(test_path):
        print test_path
        # Do stuff to the directory "test_path"
 где <your_directory> - путь к каталогу, который вы хотите пройти.
Вот несколько простых функций, основанных на примере @Blair Conrad -
import os
def get_subdirs(dir):
    "Get a list of immediate subdirectories"
    return next(os.walk(dir))[1]
def get_subfiles(dir):
    "Get a list of immediate subfiles"
    return next(os.walk(dir))[2]
 С полным путем и учетом пути существа . , .., \\, ..\\..\\subfolder и т.д.:
import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
    for x in os.walk(os.path.abspath(path))])
Этот ответ, похоже, уже не существует.
directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
 Скопируйте и вставьте в ipython:
import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))
 Вывод из print(folders):
['folderA', 'folderB']
 Недавно у меня был похожий вопрос, и я обнаружил, что лучший ответ для python 3.6 (как добавил пользователь havlock) - использовать os.scandir. Поскольку кажется, что нет решения с его использованием, я добавлю свое. Во-первых, нерекурсивное решение, которое перечисляет только подкаталоги непосредственно в корневом каталоге.
def get_dirlist(rootdir):
    dirlist = []
    with os.scandir(rootdir) as rit:
        for entry in rit:
            if not entry.name.startswith('.') and entry.is_dir():
                dirlist.append(entry.path)
    dirlist.sort() # Optional, in case you want sorted directory names
    return dirlist
Рекурсивная версия будет выглядеть так:
def get_dirlist(rootdir):
    dirlist = []
    with os.scandir(rootdir) as rit:
        for entry in rit:
            if not entry.name.startswith('.') and entry.is_dir():
                dirlist.append(entry.path)
                dirlist += get_dirlist(entry.path)
    dirlist.sort() # Optional, in case you want sorted directory names
    return dirlist
 имейте в виду, что 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/')])
Это перечислит все подкаталоги прямо в дереве файлов.
import pathlib
def list_dir(dir):
    path = pathlib.Path(dir)
    dir = []
    try:
        for item in path.iterdir():
            if item.is_dir():
                dir.append(item)
                dir = dir + list_dir(item)
        return dir
    except FileNotFoundError:
        print('Invalid directory')
 pathlib является новым в версии 3.4
 Эта функция с заданным родительским directory рекурсивно перебирает все свои directories и prints все filenames внутри которых она найдена. Слишком полезно
import os
def printDirectoryFiles(directory):
   for filename in os.listdir(directory):  
        full_path=os.path.join(directory, filename)
        if not os.path.isdir(full_path): 
            print( full_path + "\n")
def checkFolders(directory):
    dir_list = next(os.walk(directory))[1]
    #print(dir_list)
    for dir in dir_list:           
        print(dir)
        checkFolders(directory +"/"+ dir) 
    printDirectoryFiles(directory)       
main_dir="C:/Users/S0082448/Desktop/carpeta1"
checkFolders(main_dir)
input("Press enter to exit ;")
Функция для возврата списка всех подкаталогов в указанном пути к файлу. Будет искать по всему дереву файлов.
import os
def get_sub_directory_paths(start_directory, sub_directories):
    """
    This method iterates through all subdirectory paths of a given 
    directory to collect all directory paths.
    :param start_directory: The starting directory path.
    :param sub_directories: A List that all subdirectory paths will be 
        stored to.
    :return: A List of all sub-directory paths.
    """
    for item in os.listdir(start_directory):
        full_path = os.path.join(start_directory, item)
        if os.path.isdir(full_path):
            sub_directories.append(full_path)
            # Recursive call to search through all subdirectories.
            get_sub_directory_paths(full_path, sub_directories)
return sub_directories
Вот как я это делаю.
    import os
    for x in os.listdir(os.getcwd()):
        if os.path.isdir(x):
            print(x)
Если вам нужна только папка верхнего списка, используйте listdir, так как прогулка займет слишком много времени.