1. ホーム
  2. python

[解決済み] Pythonでトップレベルのディレクトリだけをリストアップする方法は?

2022-04-24 17:59:29

質問

あるフォルダの中のディレクトリだけをリストアップできるようにしたい。 つまり、ファイル名は表示させたくないし、追加のサブフォルダーもいらないということです。

例で見てみましょう。カレント・ディレクトリに

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

しかし、私はファイル名を表示させたくないのです。また、サブフォルダー(例えば \Libcurses)も必要ありません。基本的には以下のように動作します。

>>> 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() を使う)。

>>> [ 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']