获取当前目录中所有子目录的列表

时间:2009-06-10 02:48:22

标签: python directory subdirectory

有没有办法在Python中返回当前目录中所有子目录的列表?

我知道您可以使用文件执行此操作,但我需要获取目录列表。

30 个答案:

答案 0 :(得分:467)

您的意思是直接子目录,还是树下的每个目录?

无论哪种方式,您都可以使用os.walk来执行此操作:

os.walk(directory)

将为每个子目录生成一个元组。 3元组中的第一个条目是目录名,所以

[x[0] for x in os.walk(directory)]

应该以递归方式为您提供所有子目录。

请注意,元组中的第二个条目是第一个位置中条目的子目录列表,因此您可以使用它,但它不太可能为您节省太多。

但是,您可以使用它只是为了给您直接的子目录:

next(os.walk('.'))[1]

或者使用os.listdiros.path.isdir查看已发布的其他解决方案,包括“How to get all of the immediate subdirectories in Python”的解决方案。

答案 1 :(得分:139)

import os

d = '.'
[os.path.join(d, o) for o in os.listdir(d) 
                    if os.path.isdir(os.path.join(d,o))]

答案 2 :(得分:109)

您可以使用glob.glob

from glob import glob
glob("/path/to/directory/*/")

不要忘记/之后的*。{/ p>

答案 3 :(得分:49)

比上面好多了,因为你不需要几个os.path.join()并且你将直接获得完整路径(如果你愿意),你可以在 Python 3.5 +

subfolders = [f.path for f in os.scandir(folder) if f.is_dir() ]    

这将提供子目录的完整路径。 如果您只希望子目录的名称使用f.name而不是f.path

https://docs.python.org/3/library/os.html#os.scandir

答案 4 :(得分:36)

如果您需要一个能够找到子目录中所有子目录的递归解决方案,请按照之前的建议使用walk。

如果您只需要当前目录的子目录,请将os.listdiros.path.isdir

结合使用

答案 5 :(得分:23)

使用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)

答案 6 :(得分:18)

您可以使用os.listdir(路径)获取Python 2.7中的子目录(和文件)列表

import os
os.listdir(path)  # list of subdirectories and files

答案 7 :(得分:12)

仅列出目录

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)

答案 8 :(得分:9)

由于我使用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

答案 9 :(得分:8)

感谢您的提示,伙计们。我遇到了一个软链接(无限递归)作为dirs返回的问题。软链接?我们不希望没有stinkin'软链接!所以......

这只是dirs而不是softlinks:

>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']

答案 10 :(得分:7)

虽然很久以前就回答了这个问题。我想建议使用pathlib模块,因为这是一种在Windows和Unix OS上运行的强大方法。

因此,要获取特定目录中的所有路径,包括子目录:

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

答案 11 :(得分:6)

Python 3.4将the pathlib module引入标准库,它提供了一种面向对象的方法来处理文件系统路径:

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也可以通过the pathlib2 module on PyPi.

在Python 2.7上使用

答案 12 :(得分:5)

在Eli Bendersky的解决方案的基础上,使用以下示例:

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>是您要遍历的目录的路径。

答案 13 :(得分:5)

完整路径和会计路径为...\\..\\..\\subfolder等:

import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
    for x in os.walk(os.path.abspath(path))])

答案 14 :(得分:5)

以下是基于@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]

答案 15 :(得分:5)

这就是我的方法。

    import os
    for x in os.listdir(os.getcwd()):
        if os.path.isdir(x):
            print(x)

答案 16 :(得分:4)

这个答案似乎并不存在。

directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]

答案 17 :(得分:2)

我最近遇到了类似的问题,我发现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代替。有关entry对象的其他详细信息,请参阅os.DirEntry

答案 18 :(得分:2)

ipython中友好复制粘贴:

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

print(folders)的输出:

['folderA', 'folderB']

答案 19 :(得分:2)

最简单的方法:

from pathlib import Path
from glob import glob

current_dir = Path.cwd()
all_sub_dir_paths = glob(str(current_dir) + '/*/') # returns list of sub directory paths

all_sub_dir_names = [Path(sub_dir).name for sub_dir in all_sub_dir_paths] 

答案 20 :(得分:1)

这个下面的类将能够获取给定目录中的文件、文件夹和所有子文件夹的列表

import os
import json

class GetDirectoryList():
    def __init__(self, path):
        self.main_path = path
        self.absolute_path = []
        self.relative_path = []


    def get_files_and_folders(self, resp, path):
        all = os.listdir(path)
        resp["files"] = []
        for file_folder in all:
            if file_folder != "." and file_folder != "..":
                if os.path.isdir(path + "/" + file_folder):
                    resp[file_folder] = {}
                    self.get_files_and_folders(resp=resp[file_folder], path= path + "/" + file_folder)
                else:
                    resp["files"].append(file_folder)
                    self.absolute_path.append(path.replace(self.main_path + "/", "") + "/" + file_folder)
                    self.relative_path.append(path + "/" + file_folder)
        return resp, self.relative_path, self.absolute_path

    @property
    def get_all_files_folder(self):
        self.resp = {self.main_path: {}}
        all = self.get_files_and_folders(self.resp[self.main_path], self.main_path)
        return all

if __name__ == '__main__':
    mylib = GetDirectoryList(path="sample_folder")
    file_list = mylib.get_all_files_folder
    print (json.dumps(file_list))

而示例目录看起来像

sample_folder/
    lib_a/
        lib_c/
            lib_e/
                __init__.py
                a.txt
            __init__.py
            b.txt
            c.txt
        lib_d/
            __init__.py
        __init__.py
        d.txt
    lib_b/
        __init__.py
        e.txt
    __init__.py

得到结果

[
  {
    "files": [
      "__init__.py"
    ],
    "lib_b": {
      "files": [
        "__init__.py",
        "e.txt"
      ]
    },
    "lib_a": {
      "files": [
        "__init__.py",
        "d.txt"
      ],
      "lib_c": {
        "files": [
          "__init__.py",
          "c.txt",
          "b.txt"
        ],
        "lib_e": {
          "files": [
            "__init__.py",
            "a.txt"
          ]
        }
      },
      "lib_d": {
        "files": [
          "__init__.py"
        ]
      }
    }
  },
  [
    "sample_folder/lib_b/__init__.py",
    "sample_folder/lib_b/e.txt",
    "sample_folder/__init__.py",
    "sample_folder/lib_a/lib_c/lib_e/__init__.py",
    "sample_folder/lib_a/lib_c/lib_e/a.txt",
    "sample_folder/lib_a/lib_c/__init__.py",
    "sample_folder/lib_a/lib_c/c.txt",
    "sample_folder/lib_a/lib_c/b.txt",
    "sample_folder/lib_a/lib_d/__init__.py",
    "sample_folder/lib_a/__init__.py",
    "sample_folder/lib_a/d.txt"
  ],
  [
    "lib_b/__init__.py",
    "lib_b/e.txt",
    "sample_folder/__init__.py",
    "lib_a/lib_c/lib_e/__init__.py",
    "lib_a/lib_c/lib_e/a.txt",
    "lib_a/lib_c/__init__.py",
    "lib_a/lib_c/c.txt",
    "lib_a/lib_c/b.txt",
    "lib_a/lib_d/__init__.py",
    "lib_a/__init__.py",
    "lib_a/d.txt"
  ]
]

答案 21 :(得分:1)

os.path.isdir上使用过滤功能os.listdir() 像这样filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])

答案 22 :(得分:1)

通过从此处加入多个解决方案,这就是我最终使用的方法:

import os
import glob

def list_dirs(path):
    return [os.path.basename(x) for x in filter(
        os.path.isdir, glob.glob(os.path.join(path, '*')))]

答案 23 :(得分:1)

我们可以使用 os.walk()

获取所有文件夹的列表
import os

path = os.getcwd()

pathObject = os.walk(path)

pathObject 是一个对象,我们可以通过以下方式获取数组

arr = [x for x in pathObject]

arr is of type [('current directory', [array of folder in current directory], [files in current directory]),('subdirectory', [array of folder in subdirectory], [files in subdirectory]) ....]

我们可以通过遍历 arr 并打印中间数组来获取所有子目录的列表

for i in arr:
   for j in i[1]:
      print(j)

这将打印所有子目录。

要获取所有文件:

for i in arr:
   for j in i[2]:
      print(i[0] + "/" + j)

答案 24 :(得分:1)

用于返回给定文件路径中所有子目录的列表的函数。将搜索整个文件树。

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

答案 25 :(得分:0)

具有给定父级directory的此函数递归地遍历其所有directoriesprints遍历其在其中找到的所有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 ;")

答案 26 :(得分:0)

很多不错的答案,但是如果您来这里,则想找一种简单的方法一次获取所有文件或文件夹的列表。您可以利用linux和Mac上提供的 find 操作系统,该操作系统比os.walk

快得多
import os
all_files_list = os.popen("find path/to/my_base_folder -type f").read().splitlines()
all_sub_directories_list = os.popen("find path/to/my_base_folder -type d").read().splitlines()

OR

import os

def get_files(path):
    all_files_list = os.popen(f"find {path} -type f").read().splitlines()
    return all_files_list

def get_sub_folders(path):
    all_sub_directories_list = os.popen(f"find {path} -type d").read().splitlines()
    return all_sub_directories_list

答案 27 :(得分:0)

这将列出文件树正下方的所有子目录。

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版的新功能

答案 28 :(得分:0)

这应该起作用,因为它还会创建一个目录树;

import os
import pathlib

def tree(directory):
    print(f'+ {directory}')
    print("There are " + str(len(os.listdir(os.getcwd()))) + \
    " folders in this directory;")
    for path in sorted(directory.glob('*')):
        depth = len(path.relative_to(directory).parts)
        spacer = '    ' * depth
        print(f'{spacer}+ {path.name}')

这应该使用pathlib库列出文件夹中的所有目录。 path.relative_to(directory).parts获取相对于当前工作目录的元素。

答案 29 :(得分:-1)

如果您只想要顶部列表文件夹,请使用listdir作为步行花费太多时间。