このos.walk
関数は、ディレクトリとファイルに対して別々のリストを返します。WindowsやLinuxなどの多くの一般的なオペレーティングシステムでの基盤となるOS呼び出しは、各ディレクトリエントリがファイルであるかディレクトリであるかを指定するファイルタイプまたはフラグを返します。このフラグがない場合は、返されたファイル名ごとにOSに再度クエリを実行する必要があります。のコードos.walk
はこの情報を利用しますか、それともそのように破棄os.listdir
しますか?
2 に答える
いいえ、そうではありません。
内部では、とをos.walk()
使用してファイルとディレクトリを個別に一覧表示します。のソースコードを参照してください。os.listdir()
os.path.isdir()
walk()
具体的には:
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = listdir(top)
except error, err:
if onerror is not None:
onerror(err)
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
ここでlistdir
、およびは、および関数isdir
のモジュールグローバルです。サブディレクトリを再帰的に呼び出します。os.listdir()
os.path.isdir()
Martijn Pietersの答えが説明しているように、とos.walk
を使用するだけです。os.listdir
os.path.isdir
これについてはメーリングリストで数回議論されていますが、stdlibに対する具体的な提案はこれまで出てきていません。これを思ったよりも些細なことではないようにするさまざまなエッジケースがあります。また、Python 3.4以降で新しいpath
モジュールがos.walk
拡張された場合、その場で改善されるのではなく、単に置き換え/非推奨になる可能性が高くなります。
ただし、使用できるサードパーティのモジュールは多数あります。
最も単純なのはおそらくBenHoytのbetterwalk
です。彼はこれをPyPIで入手し、Python 3.4以降で提出するつもりだと思いますが、現時点ではgithubからインストールする必要があります。と呼ばれる代替品と、その上に構築された90%完全betterwalk
な代替品を提供します。ほとんどのPOSIXシステムとWin32では、通常、不要な呼び出しを回避できます。( //ほどうまく機能しない場合もありますが、最悪の場合、失敗するのではなく、不要な呼び出しを行うだけです。最後に確認したところ、完了していない可能性のある部分はシンボリックリンクを処理しています。そして多分エラー処理。)os.listdir
iterdir_stat
os.walk
stat
fts (3)
nftw (3)
find (1)
POSIXシステム用の優れたラッパーもありfts
ます。これは、最新のPOSIXシステムでのパフォーマンスに関しては明らかに理想的ですが、インターフェイスが異なり(私の意見では優れていますが、それでも異なります)、Windowsなどをサポートしていません。プラットフォーム(またはさらに古いPOSIXシステム)。
また、PyPIやその他の場所には、約30余りの「パスに関係するすべて」モジュールがあり、その一部には新しいwalk
ような機能があります。