Как перечислить только каталоги верхнего уровня в Python?
Я хочу иметь возможность перечислять только каталоги внутри какой-либо папки. Это означает, что я не хочу, чтобы имена файлов были перечислены, и мне не нужны дополнительные подпапки.
давайте посмотрим, если пример помогает. В текущем каталоге мы имеем:
>>> 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']
однако, я не хочу, чтобы имена в списке. Также мне не нужны подпапки, такие как Libcurses. По сути то, что я хочу работает со следующими:
>>> for root, dirnames, filenames in os.walk('.'):
... print dirnames
... break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
однако мне интересно, есть ли более простой способ достижения те же результаты. У меня сложилось впечатление, что с помощью ОС.ходить только для того, чтобы вернуть верхний уровень неэффективно/слишком много.
15 ответов:
фильтр результат с помощью ОС.путь.isdir() (и использовать ОС.путь.join () чтобы получить реальный путь):
>>> [ name for name in os.listdir(thedir) if os.path.isdir(os.path.join(thedir, name)) ] ['ctypes', 'distutils', 'encodings', 'lib-tk', 'config', 'idlelib', 'xml', 'bsddb', 'hotshot', 'logging', 'doc', 'test', 'compiler', 'curses', 'site-packages', 'email', 'sqlite3', 'lib-dynload', 'wsgiref', 'plat-linux2', 'plat-mac']
os.walk('.').next()[1]
или с Python 3 Использовать
next(os.walk('.'))[1]
как сказал @Andre Soares в комментарии ниже.
фильтровать список с помощью ОС.путь.isdir для обнаружения каталогов.
filter(os.path.isdir, os.listdir(os.getcwd()))
обратите внимание, что вместо того, чтобы делать
os.listdir(os.getcwd())
, это предпочтительнее делатьos.listdir(os.path.curdir)
. Одним вызовом функции меньше, и он такой же портативный.Итак, для завершения ответа, чтобы получить список каталогов в папке:
def listdirs(folder): return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]
если вы предпочитаете полные пути, то используйте эту функцию:
def listdirs(folder): return [ d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder)) if os.path.isdir(d) ]
просто добавить, что с помощью ОС.listdir() не " возьмите много обработки против очень простой ОС.идти.)(следующий()[1]". Это потому, что ОС.прогулка() использует ОС.listdir() внутренне. На самом деле, если вы проверяете их вместе:
>>>> import timeit >>>> timeit.timeit("os.walk('.').next()[1]", "import os", number=10000) 1.1215229034423828 >>>> timeit.timeit("[ name for name in os.listdir('.') if os.path.isdir(os.path.join('.', name)) ]", "import os", number=10000) 1.0592019557952881
фильтрация ОС.listdir() очень немного быстрее.
очень простой и элегантный способ использовать это:
import os dir_list = os.walk('.').next()[1] print dir_list
запустите этот скрипт в той же папке, для которой вы хотите папку names.It даст вам только имя непосредственных папок (это тоже без полного пути к папкам).
это, кажется, тоже работает (по крайней мере, на linux):
import glob, os glob.glob('*' + os.path.sep)
будучи новичком здесь, я пока не могу напрямую комментировать, но вот небольшая поправка, которую я хотел бы добавить к следующей части τωωτιιου ответ:
Если вы предпочитаете полные пути, то используйте эту функцию:
def listdirs(folder): return [ d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder)) if os.path.isdir(d) ]
для тех, кто все еще на python : внутренняя конструкция должна быть списком вместо кортежа и поэтому должна выглядеть так:
def listdirs(folder): return [ d for d in [os.path.join(folder, d1) for d1 in os.listdir(folder)] if os.path.isdir(d) ]
иначе получается синтаксис ошибка.
для списка полных имен путей я предпочитаю эту версию другой решений здесь:
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))]
scanDir = "abc" directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]
более безопасный вариант, который не подведет, когда нет каталога.
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 []
-- 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