実現したいこと
Pythonでファイル一覧を取得する方法はいろいろなサイトで紹介されているのですが、それらを利用してもフォルダの階層が深くてフォルダやファイル数が膨大な場合は何時間たっても処理が終わらないということになります。
Pythonでファイル一覧を取得するという行為自体は定番だと思うのですが、最速については定番がまだ存在しないように思います。
そこで「定番はこれだ」といえるようなサンプルがあるといいなと思います。
実現できないでしょうか。
発生している問題・分からないこと
上記の実現したいことと同じです。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
quiitaその他のサンプルコードをいろいろ使ってみましたが、小規模なディレクトリ構造では問題ないものの、Cドライブ丸ごとファイルリスト作成というような大規模なディレクトリに対する操作となると何時間たっても終わらず困ってしまいました。
補足
特になし
> Cドライブ丸ごとファイルリスト作成というような大規模なディレクトリに対する操作となると何時間たっても終わらず困ってしまいました。
「それが最速だった」という可能性については考慮していますか?
> quiitaその他のサンプルコードをいろいろ使ってみましたが、小規模なディレクトリ構造では問題ないものの、Cドライブ丸ごとファイルリスト作成というような大規模なディレクトリに対する操作となると何時間たっても終わらず困ってしまいました。
どのようなライブラリやコードを使用されましたか?回答者が同じ回答をしても無駄かと思いますので。
> 最速については定番がまだ存在しないように思います。
と思った具体的な理由は何でしょうか?
「いくつかのやり方を比較したが、結果についてこれこれの差異がある」とかですかね?
>otnさん
定番があったら、内容の違う記事が増え続けることはないと思ってそう考えました。
「いくつかのやり方があるのはわかったが、どれがはbestなのか判定することで困っている」というのが困りごとです。
> 定番があったら、内容の違う記事が増え続けることはないと思ってそう考えました。
そんなこともないと思います。書き方の好みもありますし、優先すべきものが速度以外のこともありえます。ブログなどは備忘録のためやアウトプットの練習としても書かれることがあるので情報の信頼度としてはそこまで高くないかと思います。
質問者さんにとってのベストが知りたいのなら対象の環境でベンチマークするのが近道かと思います。
やり方は要件次第なので、要件に合わせて方法を選択します。
「Cドライブ内のファイル一覧を取得する」はおそらく要件じゃなくて、要件を実現する際に使うパーツの1つの機能ですね。もし「一覧取得だけが最終目的で、取得したファイル名をファイルに書いて業務完了」なら、プログラムを書かずに dir /s /b とか dir /s /b /a-d とかが解決策でしょう。
回答に書いたとおり、HDDから100万個くらいのリストを取得するのが3分くらいです。「何時間たっても終わらず」ということはリスト取得だけではなく他の処理もやっているはずで(※)、それら含めた全体で何をしたいのかの要件によってトータルでどういう処理にすれ良いかを、「毎回考える」のが設計です。
(※:ディスクが壊れ掛かってリトライで時間が掛かっているのでなければ)
じゃあ、毎回全くゼロから考えるのかというと、そんなことはなくて、おそらく最初は glob.globかglob.iglobを考えて(要件次第では pathlib.globが良いかもしれません)、それでは要件が満たせない場合に、初めて他の手段を考える人が多いのではないかと思います。globで駄目な原因が明確になっているので、他の手段を探しやすい。