1. ホーム
  2. python

[解決済み] os.walkでディレクトリを除外する。

2022-04-22 17:04:32

質問

ディレクトリツリーに降りていき(os.walk()を使用)、特定のファイル拡張子に一致する各ファイルを訪問するスクリプトを書いています。しかし、私のツールが使用されるディレクトリツリーのいくつかは、サブディレクトリを含んでおり、そのサブディレクトリには ロット このスクリプトの目的には)役に立たないものがあるので、探索から除外するディレクトリのリストをユーザーが指定できるオプションを追加しようと考えた。

これは os.walk() を使えば簡単です。結局のところ、os.walk()によって得られたそれぞれのファイル/ディレクトリを実際に訪れたいのか、それとも単にスキップしたいのかを決めるのは私次第なのです。問題は、例えば次のようなディレクトリツリーがあった場合です。

root--
     |
     --- dirA
     |
     --- dirB
     |
     --- uselessStuff --
                       |
                       --- moreJunk
                       |
                       --- yetMoreJunk

を除外したい。 無用なもの とその子ディレクトリの全てに対して、os.walk() は、まだ、すべての(潜在的には数千の)サブディレクトリに降下します。 無用なもの これは言うまでもなく、物事を大きく遅らせることになります。理想的な世界では、os.walk() に、これ以上 uselessStuff しかし、私の知る限りでは、そのような方法はありません(あるのでしょうか)。

どなたか思い当たる方はいらっしゃいますか?もしかしたら、そのようなものを提供するサードパーティのライブラリがあるのかもしれませんね?

どのように解決するのですか?

修正方法 dirs インプレース が訪れた (後続の) ファイルとディレクトリを刈り込みます。 os.walk :

# exclude = set(['New folder', 'Windows', 'Desktop'])
for root, dirs, files in os.walk(top, topdown=True):
    dirs[:] = [d for d in dirs if d not in exclude]


help(os.walk)より。

topdown が true の場合、呼び出し側は dirnames リストをインプレースで変更することができます。 (例えば、del や slice の代入で)、walk は再帰的にのみ に残っているサブディレクトリを使用することができます。 を切り捨てる。