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

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

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

Ответы [ 23 ]

8 голосов
/ 10 мая 2013

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

Это только каталоги, а не программные ссылки:

>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
8 голосов
/ 28 мая 2017

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.

7 голосов
/ 07 июля 2016

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

и т.д.

5 голосов
/ 19 июля 2017

Вот пара простых функций, основанных на примере @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]
5 голосов
/ 06 октября 2013

С полным путем и с учетом пути: ., .., \\, ..\\..\\subfolder и т. Д .:

import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
    for x in os.walk(os.path.abspath(path))])
5 голосов
/ 05 января 2016

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

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

4 голосов
/ 23 февраля 2017

Этот ответ, кажется, уже не существует.

directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
2 голосов
/ 11 октября 2018

Копировать можно без проблем в ipython:

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

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

['folderA', 'folderB']
2 голосов
/ 16 февраля 2018

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

1 голос
/ 08 февраля 2016

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

...