我希望能够只列出某个文件夹中的目录.这意味着我不希望列出文件名,也不想要其他子文件夹.
让我们看一个例子是否有帮助.在当前目录中,我们有:
>>> 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.walk
与next
项目功能一起使用:
next(os.walk('.'))[1]
对于Python <= 2.5,请使用:
os.walk('.').next()[1]
os.walk
是一个生成器,调用next
将以3元组(dirpath,dirnames,filenames)的形式获得第一个结果.因此,[1]
索引仅返回dirnames
该元组.
使用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.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]".这是因为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)