Я хочу иметь возможность отображать только каталоги внутри какой-либо папки. Это означает, что мне не нужны перечисленные имена файлов и не нужны дополнительные подпапки.
Посмотрим, поможет ли пример. В текущем каталоге у нас есть:
>>> 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 только для возврата на верхний уровень неэффективно / слишком много.
python
filesystems
fuentesjr
источник
источник
os.walk
Использование
os.walk
сnext
функцией элемента:Для Python <= 2.5 используйте:
Как это работает
os.walk
является генератором, и при вызовеnext
будет получен первый результат в виде трех кортежей (dirpath, dirnames, filenames). Таким образом,[1]
индекс возвращает толькоdirnames
из этого кортежа.источник
DIRNAMES=1
а затем,next()[DIRNAMES]
чтобы облегчить понимание для будущих разработчиков кода.os.walk( os.path.join(mypath,'.')).next()[1]
sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
Отфильтруйте список с помощью os.path.isdir для обнаружения каталогов.
источник
os.listdir
возвращает имя файла / папки, переданноеos.path.isdir
, но для последнего нужен полный путь.timeit(os.walk(os.getcwd()).next()[1])
1000 loops, best of 3: 734 µs per loop
timeit(filter(os.path.isdir, os.listdir(os.getcwd())))
1000 loops, best of 3: 477 µs per loop
источник
Обратите внимание, что вместо того, чтобы делать
os.listdir(os.getcwd())
, предпочтительнее делатьos.listdir(os.path.curdir)
. На один вызов функции меньше, и он такой же переносимый.Итак, чтобы завершить ответ, получить список каталогов в папке:
Если вы предпочитаете полные пути, используйте эту функцию:
источник
Кажется, это тоже работает (по крайней мере, на Linux):
источник
glob
. Это может сэкономить вам много кода, особенно итераций, и очень похоже на использование терминала UNIX (ls
)Просто добавлю, что использование os.listdir () не требует «много обработки по сравнению с очень простой os.walk (). Next () [1]» . Это потому, что os.walk () внутренне использует os.listdir (). Фактически, если вы протестируете их вместе:
Фильтрация os.listdir () выполняется немного быстрее.
источник
scandir
пакет - доступен для Python 2.6 и более поздних версий как устанавливаемый пакет на PyPI. Он предлагает замену дляos.walk
иos.listdir
что гораздо быстрее.Намного более простой и элегантный способ - использовать это:
Запустите этот скрипт в той же папке, для которой вы хотите получить имена папок. Он даст вам только точное имя папок (и это тоже без полного пути к папкам).
источник
Используя понимание списка,
Я думаю это самый простой способ
источник
будучи здесь новичком, я пока не могу напрямую комментировать, но вот небольшое исправление, которое я хотел бы добавить к следующей части ответа ΤΖΩΤΖΙΟΥ :
для тех, кто все еще использует python <2.4 : внутренняя конструкция должна быть списком, а не кортежем, и поэтому должна выглядеть так:
в противном случае возникает синтаксическая ошибка.
источник
источник
Для списка полных имен путей я предпочитаю эту версию другим решениям здесь:
источник
источник
Более безопасный вариант, который не сработает, когда нет каталога.
источник
Вот так?
источник
Python 3.4 вводится в
pathlib
модуле в стандартную библиотеку, которая обеспечивает объектно - ориентированный подход для обработки файловой системы путей:источник
источник