如何在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))]