当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Python中仅列出顶级目录?》经验,为你挑选了8个好方法。

我希望能够只列出某个文件夹中的目录.这意味着我不希望列出文件名,也不想要其他子文件夹.

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

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



1> Alex Coventr..:

os.walk

os.walknext项目功能一起使用:

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

对于Python <= 2.5,请使用:

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

这是如何工作的

os.walk是一个生成器,调用next将以3元组(dirpath,dirnames,filenames)的形式获得第一个结果.因此,[1]索引仅返回dirnames该元组.


for python v3:next(os.walk('.')))[1]
关于这一点的更多描述是这是一个发电机,除非你告诉它,它不会走向其他目的地.所以.next()[1]在一行中做了所有列表推导所做的事情.我可能会做一些像`DIRNAMES = 1`然后`next()[DIRNAMES]`的东西,以便更容易理解未来的代码维护者.
+1惊人的解决方案 要指定要浏览的目录,请使用:`os.walk(os.path.join(mypath,'.')).next()[1]`

2> Thomas Woute..:

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

3> Colin Jensen..:

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

filter(os.path.isdir, os.listdir(os.getcwd()))


这没用.我的猜测是`os.listdir`返回一个文件/文件夹名,传递给`os.path.isdir`,但后者需要一个完整的路径.
我认为这是迄今为止这些答案中可读性和简洁性的最佳组合.
filter比os.walk`timeit更快(os.walk(os.getcwd()).next()[1])``1000循环,最佳3:734μs每循环``timeit(filter(os.path) .isdir,os.listdir(os.getcwd())))``1000循环,最佳3:477μs每循环

4> Mark Roddy..:
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]


这可以缩短为filter(os.path.isdir,os.listdir(os.getcwd())
有没有人有关于过滤器或列表理解是否更快的任何信息?否则它只是一个主观论点.这当然假设cwd中有1000万个目录,性能是个问题.

5> tzot..:

请注意,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)
    ]



6> foz..:

只是补充一点,使用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()的过滤速度非常快.


使用Python 3.5是获取目录内容的更快方法:https://www.python.org/dev/peps/pep-0471/

7> 小智..:

一个非常简单和优雅的方法是使用这个:

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

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



8> Travis..:

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

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


而不是glob.glob('\*'+ os.path.sep),如果os.path.isdir(dir),你可能想在glob.glob("\*")中编写[dir for dir]
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有