如何在Python中列出顶级目录?

我想只能列出一些文件夹内的目录。 这意味着我不想列出文件名,也不需要额外的子文件夹。

让我们看看是否有帮助。 在当前目录中我们有:

>>> 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()获取真实path):

 >>> [ 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('.').next()[1] 

或与Python 3使用

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

正如@Andre Soares在下面的评论中所说的那样。

使用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) 。 less一个函数调用,并且它是可移植的。

所以,要完成答案,要得到一个文件夹中的目录列表:

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

如果你喜欢完整的path名,那么使用这个函数:

 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]“ 。 这是因为os.walk()在内部使用os.listdir()。 事实上,如果你一起testing它们:

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

在你想要的文件夹名称相同的文件夹中运行这个脚本。它只会给你立即文件夹的名称(也没有文件夹的完整path)。

这似乎也工作(至less在Linux上):

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

作为新手这里我还不能直接评论,但这里是一个小的更正,我想补充到以下部分ΤΖΩΤΖΙΟΥ的答案 :

如果你喜欢完整的path名,那么使用这个函数:

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

否则会得到一个语法错误。

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

有关完整path名称的列表,我更喜欢这个版本到这里的其他解决scheme :

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

像这样?

>>> [os.listdirpath(os.getcwd())如果os.path.isdir(path)]

没有目录时不会失败的安全选项。

 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 [] 
 scanDir = "abc" directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]