2

このos.walk関数は、ディレクトリとファイルに対して別々のリストを返します。WindowsやLinuxなどの多くの一般的なオペレーティングシステムでの基盤となるOS呼び出しは、各ディレクトリエントリがファイルであるかディレクトリであるかを指定するファイルタイプまたはフラグを返します。このフラグがない場合は、返されたファイル名ごとにOSに再度クエリを実行する必要があります。のコードos.walkはこの情報を利用しますか、それともそのように破棄os.listdirしますか?

4

2 に答える 2

5

いいえ、そうではありません。

内部では、とを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()

于 2013-03-06T22:30:09.010 に答える
2

Martijn Pietersの答えが説明しているように、とos.walkを使用するだけです。os.listdiros.path.isdir

これについてはメーリングリストで数回議論されていますが、stdlibに対する具体的な提案はこれまで出てきていません。これを思ったよりも些細なことではないようにするさまざまなエッジケースがあります。また、Python 3.4以降で新しいpathモジュールがos.walk拡張された場合、その場で改善されるのではなく、単に置き換え/非推奨になる可能性が高くなります。

ただし、使用できるサードパーティのモジュールは多数あります。

最も単純なのはおそらくBenHoytのbetterwalkです。彼はこれをPyPIで入手し、Python 3.4以降で提出するつもりだと思いますが、現時点ではgithubからインストールする必要があります。と呼ばれる代替品と、その上に構築された90%完全betterwalkな代替品を提供します。ほとんどのPOSIXシステムとWin32では、通常、不要な呼び出しを回避できます。( //ほどうまく機能しない場合もありますが、最悪の場合、失敗するのではなく、不要な呼び出しを行うだけです。最後に確認したところ、完了していない可能性のある部分はシンボリックリンクを処理しています。そして多分エラー処理。)os.listdiriterdir_statos.walkstatfts (3)nftw (3)find (1)

POSIXシステム用の優れたラッパーもありftsます。これは、最新のPOSIXシステムでのパフォーマンスに関しては明らかに理想的ですが、インターフェイスが異なり(私の意見では優れていますが、それでも異なります)、Windowsなどをサポートしていません。プラットフォーム(またはさらに古いPOSIXシステム)。

また、PyPIやその他の場所には、約30余りの「パスに関係するすべて」モジュールがあり、その一部には新しいwalkような機能があります。

于 2013-03-06T22:37:56.773 に答える