我希望只能列出某个文件夹中的目录。 这意味着我不希望列出文件名,也不想要额外的子文件夹。

让我们看一个例子是否有帮助。在当前目录中,我们有:

>>> 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返回顶级效率低效/太多。

有帮助吗?

解决方案

使用os.path.isdir()过滤结果(并使用os.path.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

使用 os.walk https://docs.python.org/3/library/functions.html#next"rel =“noreferrer”> next 项目功能:

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

对于 Python <!> lt; = 2.5 使用:

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

如何运作

[1]是一个生成器,并且调用dirnames将以3元组(dirpath,dirnames,filenames)的形式获得第一个结果。因此<=>索引仅返回该元组的<=>。

使用os.path.isdir过滤列表以检测目录。

filter(os.path.isdir, os.listdir(os.getcwd()))
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]

请注意,不要执行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)
    ]

只是添加使用os.listdir()不 <!>“;需要大量处理而非简单的os.walk()。next()[1] <!> quot; 。这是因为os.walk()在内部使用os.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

os.listdir()的过滤速度要快一些。

一种非常简单和优雅的方式是使用它:

 import os
 dir_list = os.walk('.').next()[1]
 print dir_list

在您想要文件夹名称的同一文件夹中运行此脚本。它将仅为您提供完整的文件夹名称(也没有文件夹的完整路径)。

这似乎也有效(至少在linux上):

import glob, os
glob.glob('*' + os.path.sep)

作为新手在这里我还不能直接评论,但这里是一个小的修正我想添加到 <>#932; <!>#918; <!>#937; <!>#932;!<>#918 ; <!>#921; <!>#927; <!>#933;的回答

  

如果您更喜欢完整路径名,请使用此功能:

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上的人<!> lt; 2.4 :内部构造需要是一个列表而不是一个元组,因此应该如下所示:

def listdirs(folder):  
  return [
    d for d in [os.path.join(folder, d1) for d1 in os.listdir(folder)]
    if os.path.isdir(d)
  ]

否则会出现语法错误。

使用列表理解,

[a for a in os.listdir() if os.path.isdir(a)]

我认为这是最简单的方法

[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]

有关完整路径名的列表,我更喜欢此版本,而不是其他解决方案

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 []

喜欢这样吗?

>>>> [path for path in os.listdir(os.getcwd()) if os.path.isdir(path)]
-- 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top