Есть ли способ вернуть список всех подкаталогов в текущем каталоге в Python?
Я знаю, что вы можете делать это с файлами, но мне нужно получить список каталогов.
Есть ли способ вернуть список всех подкаталогов в текущем каталоге в Python?
Я знаю, что вы можете делать это с файлами, но мне нужно получить список каталогов.
Вы имеете в виду немедленные подкаталоги или каждый каталог прямо вниз по дереву?
В любом случае вы можете использовать os.walk
, чтобы сделать это:
os.walk(directory)
даст кортеж для каждого подкаталога. Первая запись в 3-кортеже - это имя каталога, поэтому
[x[0] for x in os.walk(directory)]
должен дать вам все подкаталоги, рекурсивно.
Обратите внимание, что вторая запись в кортеже - это список дочерних каталогов записи в первой позиции, поэтому вы можете использовать это вместо этого, но это вряд ли сэкономит вам много.
Однако вы можете использовать его только для предоставления вам непосредственных дочерних каталогов:
next(os.walk('.'))[1]
Или посмотрите другие опубликованные решения, используя os.listdir
и os.path.isdir
, в том числе в Как получить все непосредственные подкаталоги в Python.
import os
d = '.'
[os.path.join(d, o) for o in os.listdir(d)
if os.path.isdir(os.path.join(d,o))]
Вы можете просто использовать glob.glob
from glob import glob
glob("/path/to/directory/*/")
Не забывайте о конце /
после *
.
Намного лучше, чем выше, потому что вам не нужно несколько os.path.join(), и вы получите полный путь напрямую (если хотите), вы можете сделать это в Python 3.5 +
subfolders = [f.path for f in os.scandir(folder) if f.is_dir() ]
Это даст полный путь к подкаталогу.
Если вы хотите, чтобы имя подкаталога использовало f.name
вместо f.path
Если вам нужно рекурсивное решение, которое найдет все подкаталоги в подкаталогах, используйте walk, как было предложено ранее.
Если вам нужны только текущие каталоги дочерних каталогов, объедините os.listdir
с os.path.isdir
Я предпочитаю использовать фильтр (https://docs.python.org/2/library/functions.html#filter), но это только вопрос вкуса.
d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
Реализовал это используя 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)
Вы можете получить список подкаталогов (и файлов) в Python 2.7 с помощью os.listdir(path)
import os
os.listdir(path) # list of subdirectories and files
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)
Так как я наткнулся на эту проблему, используя пути 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
Хотя на этот вопрос давно ответили. Я хочу порекомендовать использовать модуль 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
и т.п.
Спасибо за советы, ребята. Я столкнулся с проблемой, когда softlinks (бесконечная рекурсия) возвращаются как dirs. Softlinks? Мы не хотим никаких бесплатных ссылок! Так что...
Это отображалось только в каталогах, а не в программных ссылках:
>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
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.
Основываясь на решении Эли Бендерски, используйте следующий пример:
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>
- путь к каталогу, который вы хотите пройти.
Вот несколько простых функций, основанных на примере @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]
С полным путем и учетом пути существа .
, ..
, \\
, ..\\..\\subfolder
и т.д.:
import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
for x in os.walk(os.path.abspath(path))])
Этот ответ, похоже, уже не существует.
directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
Скопируйте и вставьте в ipython
:
import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))
Вывод из print(folders)
:
['folderA', 'folderB']
Недавно у меня был похожий вопрос, и я обнаружил, что лучший ответ для 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
.
используйте функцию фильтра os.path.isdir
над os.listdir()
что-то вроде этого filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
Это перечислит все подкаталоги прямо в дереве файлов.
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
Эта функция с заданным родительским 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 ;")
Функция для возврата списка всех подкаталогов в указанном пути к файлу. Будет искать по всему дереву файлов.
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
Вот как я это делаю.
import os
for x in os.listdir(os.getcwd()):
if os.path.isdir(x):
print(x)
Если вам нужна только папка верхнего списка, используйте listdir, так как прогулка займет слишком много времени.