167

あるフォルダ内のディレクトリのみを一覧表示できるようにしたい。つまり、ファイル名をリストしたくないし、サブフォルダーを追加したくないということです。

例が役立つかどうか見てみましょう。現在のディレクトリには次のものがあります。

>>> 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 を使用するのは非効率的/多すぎるという印象を受けます。

4

20 に答える 20

243

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そのタプルからのみを返します。

于 2008-09-26T23:57:04.597 に答える
161

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']
于 2008-09-26T19:06:57.477 に答える
68

os.path.isdir を使用してリストをフィルタリングし、ディレクトリを検出します。

filter(os.path.isdir, os.listdir(os.getcwd()))
于 2008-09-26T19:10:36.157 に答える
19
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]
于 2008-09-26T19:04:46.907 に答える
14

を実行する代わりに、を実行os.listdir(os.getcwd())することをお勧めしますos.listdir(os.path.curdir)。関数呼び出しが1つ少なくなり、移植性も高くなります。

したがって、答えを完成させるには、フォルダ内のディレクトリのリストを取得します。

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)
    ]
于 2008-09-26T22:32:50.947 に答える
13

これもうまくいくようです(少なくともLinuxでは):

import glob, os
glob.glob('*' + os.path.sep)
于 2016-07-06T04:54:49.890 に答える
9

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() のフィルタリングは、わずかに高速です。

于 2013-01-17T11:57:25.733 に答える
6

非常にシンプルでエレガントな方法は、これを使用することです:

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

フォルダ名が必要な同じフォルダでこのスクリプトを実行します。これにより、直接のフォルダ名のみが正確に表示されます(フォルダのフルパスもありません)。

于 2014-10-13T11:26:42.517 に答える
2

ここでは初心者なので、まだ直接コメントすることはできませんが、 ΤΖΩΤΖΙΟΥの答えの次の部分に追加したい小さな修正があります。

フル パス名を使用する場合は、次の関数を使用します。

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

そうしないと、構文エラーが発生します。

于 2011-01-27T18:25:17.837 に答える
2
[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]
于 2008-09-26T19:05:26.733 に答える
1

フルパス名のリストについては、他のソリューションよりもこのバージョンの方が好きです。

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))]
于 2013-03-20T10:53:08.207 に答える
0

そのようです?

>>>> [path for path in os.listdir(os.getcwd()) if os.path.isdir(path)]
于 2008-09-26T19:05:26.247 に答える