首页 文章

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

提问于
浏览
358

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

我知道你可以用文件做到这一点,但我需要获取目录列表 .

21 回答

  • 5

    你可以使用 glob.glob

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

    不要忘记 * 之后的尾随 / .

  • 1

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

  • 36

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

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

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

  • 5

    仅列出目录

    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)
    
  • 2

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

    无论哪种方式,您都可以使用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”的解决方案 .

  • 5

    我最近有一个类似的问题,我发现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 .

  • 23

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

  • 428

    ipython 中复制粘贴友好:

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

    来自 print(folders) 的输出:

    ['folderA', 'folderB']
    
  • 14
    import os
    
    d = '.'
    [os.path.join(d, o) for o in os.listdir(d) 
                        if os.path.isdir(os.path.join(d,o))]
    
  • 5

    虽然很久以前就回答了这个问题 . 我想建议使用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
    

    等等

  • 34

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

    这只是dirs而不是softlinks:

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

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

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

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

  • 89

    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也可以在Python 2.7上通过the pathlib2 module on PyPi.获得

  • 8

    这个答案似乎并不存在 .

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

    我更喜欢使用过滤器(https://docs.python.org/2/library/functions.html#filter),但这只是一个品味问题 .

    d='.'
    filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
    
  • 20

    使用完整路径并计算路径为 ...\\..\\..\\subfolder 等:

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

    如果您需要一个可以找到子目录中所有子目录的递归解决方案,请使用之前建议的walk .

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

  • -1

    比上面好多了,因为你不需要几个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

相关问题