Как перечислить только каталоги верхнего уровня в Python? - PullRequest
105 голосов
/ 26 сентября 2008

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

Посмотрим, поможет ли пример. В текущем каталоге мы имеем:

>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
 'Tools', 'w9xpopen.exe']

Однако я не хочу перечислять имена файлов. Также я не хочу подпапки, такие как \ Lib \ curses. По сути, то, что я хочу, работает со следующим:

>>> for root, dirnames, filenames in os.walk('.'):
...     print dirnames
...     break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']

Однако мне интересно, есть ли более простой способ достижения тех же результатов. У меня складывается впечатление, что использование os.walk только для возвращения верхнего уровня неэффективно / слишком много.

Ответы [ 16 ]

1 голос
/ 18 сентября 2017
scanDir = "abc"
directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]
1 голос
/ 20 марта 2013

Для получения списка полных путей я предпочитаю эту версию другим решениям здесь:

def listdirs(dir):
    return [os.path.join(os.path.join(dir, x)) for x in os.listdir(dir) 
        if os.path.isdir(os.path.join(dir, x))]
1 голос
/ 26 сентября 2008
[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]
0 голосов
/ 27 февраля 2018
-- This will exclude files and traverse through 1 level of sub folders in the root

def list_files(dir):
    List = []
    filterstr = ' '
    for root, dirs, files in os.walk(dir, topdown = True):
        #r.append(root)
        if (root == dir):
            pass
        elif filterstr in root:
            #filterstr = ' '
            pass
        else:
            filterstr = root
            #print(root)
            for name in files:
                print(root)
                print(dirs)
                List.append(os.path.join(root,name))
            #print(os.path.join(root,name),"\n")
                print(List,"\n")

    return List
0 голосов
/ 21 июля 2017

Более безопасный вариант, который не дает сбоя при отсутствии каталога.

def listdirs(folder):
    if os.path.exists(folder):
         return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]
    else:
         return []
0 голосов
/ 26 сентября 2008

Как так?

>>>> [path for path in os.listdir(os.getcwd()) if os.path.isdir(path)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...