Получение списка всех подкаталогов в текущем каталоге

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

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

Ответы

Ответ 1

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

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

os.walk(directory)

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

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

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

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

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

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

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

Ответ 2

import os

d = '.'
[os.path.join(d, o) for o in os.listdir(d) 
                    if os.path.isdir(os.path.join(d,o))]

Ответ 3

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

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

Не забывайте о конце / после *.

Ответ 4

Намного лучше, чем выше, потому что вам не нужно несколько 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

Ответ 5

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

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

Ответ 7

Реализовал это используя 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)

Ответ 8

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

import os
os.listdir(path)  # list of subdirectories and files

Ответ 9

Перечисление только каталогов

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)

Ответ 10

Так как я наткнулся на эту проблему, используя пути 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

Ответ 11

Хотя на этот вопрос давно ответили. Я хочу порекомендовать использовать модуль 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

и т.п.

Ответ 12

Спасибо за советы, ребята. Я столкнулся с проблемой, когда softlinks (бесконечная рекурсия) возвращаются как dirs. Softlinks? Мы не хотим никаких бесплатных ссылок! Так что...

Это отображалось только в каталогах, а не в программных ссылках:

>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']

Ответ 13

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.

Ответ 14

Основываясь на решении Эли Бендерски, используйте следующий пример:

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> - путь к каталогу, который вы хотите пройти.

Ответ 15

Вот несколько простых функций, основанных на примере @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]

Ответ 16

С полным путем и учетом пути существа . , .., \\, ..\\..\\subfolder и т.д.:

import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
    for x in os.walk(os.path.abspath(path))])

Ответ 17

Этот ответ, похоже, уже не существует.

directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]

Ответ 18

Скопируйте и вставьте в ipython:

import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))

Вывод из print(folders):

['folderA', 'folderB']

Ответ 19

Недавно у меня был похожий вопрос, и я обнаружил, что лучший ответ для 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.

Ответ 20

используйте функцию фильтра os.path.isdir над os.listdir() что-то вроде этого filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])

Ответ 21

Это перечислит все подкаталоги прямо в дереве файлов.

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

Ответ 22

Эта функция с заданным родительским 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 ;")

Ответ 23

Функция для возврата списка всех подкаталогов в указанном пути к файлу. Будет искать по всему дереву файлов.

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

Ответ 24

Вот как я это делаю.

    import os
    for x in os.listdir(os.getcwd()):
        if os.path.isdir(x):
            print(x)

Ответ 25

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