🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

732閲覧

PythonでCドライブ内のファイル一覧を取得する最速の方法

occhy

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2024/11/02 01:58

実現したいこと

Pythonでファイル一覧を取得する方法はいろいろなサイトで紹介されているのですが、それらを利用してもフォルダの階層が深くてフォルダやファイル数が膨大な場合は何時間たっても処理が終わらないということになります。
Pythonでファイル一覧を取得するという行為自体は定番だと思うのですが、最速については定番がまだ存在しないように思います。
そこで「定番はこれだ」といえるようなサンプルがあるといいなと思います。
実現できないでしょうか。

発生している問題・分からないこと

上記の実現したいことと同じです。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

quiitaその他のサンプルコードをいろいろ使ってみましたが、小規模なディレクトリ構造では問題ないものの、Cドライブ丸ごとファイルリスト作成というような大規模なディレクトリに対する操作となると何時間たっても終わらず困ってしまいました。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/11/02 02:43

> Cドライブ丸ごとファイルリスト作成というような大規模なディレクトリに対する操作となると何時間たっても終わらず困ってしまいました。 「それが最速だった」という可能性については考慮していますか?
meg_

2024/11/02 05:17

> quiitaその他のサンプルコードをいろいろ使ってみましたが、小規模なディレクトリ構造では問題ないものの、Cドライブ丸ごとファイルリスト作成というような大規模なディレクトリに対する操作となると何時間たっても終わらず困ってしまいました。 どのようなライブラリやコードを使用されましたか?回答者が同じ回答をしても無駄かと思いますので。
otn

2024/11/03 03:39 編集

> 最速については定番がまだ存在しないように思います。 と思った具体的な理由は何でしょうか? 「いくつかのやり方を比較したが、結果についてこれこれの差異がある」とかですかね?
occhy

2024/11/03 13:59 編集

>otnさん 定番があったら、内容の違う記事が増え続けることはないと思ってそう考えました。 「いくつかのやり方があるのはわかったが、どれがはbestなのか判定することで困っている」というのが困りごとです。
meg_

2024/11/03 15:22

> 定番があったら、内容の違う記事が増え続けることはないと思ってそう考えました。 そんなこともないと思います。書き方の好みもありますし、優先すべきものが速度以外のこともありえます。ブログなどは備忘録のためやアウトプットの練習としても書かれることがあるので情報の信頼度としてはそこまで高くないかと思います。 質問者さんにとってのベストが知りたいのなら対象の環境でベンチマークするのが近道かと思います。
otn

2024/11/03 15:45

やり方は要件次第なので、要件に合わせて方法を選択します。 「Cドライブ内のファイル一覧を取得する」はおそらく要件じゃなくて、要件を実現する際に使うパーツの1つの機能ですね。もし「一覧取得だけが最終目的で、取得したファイル名をファイルに書いて業務完了」なら、プログラムを書かずに dir /s /b とか dir /s /b /a-d とかが解決策でしょう。 回答に書いたとおり、HDDから100万個くらいのリストを取得するのが3分くらいです。「何時間たっても終わらず」ということはリスト取得だけではなく他の処理もやっているはずで(※)、それら含めた全体で何をしたいのかの要件によってトータルでどういう処理にすれ良いかを、「毎回考える」のが設計です。 (※:ディスクが壊れ掛かってリトライで時間が掛かっているのでなければ) じゃあ、毎回全くゼロから考えるのかというと、そんなことはなくて、おそらく最初は glob.globかglob.iglobを考えて(要件次第では pathlib.globが良いかもしれません)、それでは要件が満たせない場合に、初めて他の手段を考える人が多いのではないかと思います。globで駄目な原因が明確になっているので、他の手段を探しやすい。
guest

回答2

0

CドライブとあるのでWindowsですね。もし対象のドライブのフォーマットがNTFSであれば、MFT(Master File Table)というファイルの管理情報に直接アクセスして情報を取得するのが最速を目指す道になるかと思います。ただし、管理者権限が必要であり、また、直接ファイルシステムにアクセスする関係で、一歩間違うとバグでボリュームを破壊してしまうリスクがあります。

残念ながら手元にWindowsがないのと、前述のリスクからあまりお気軽にサンプルを書いてご提示することができないのですが、もしコード書いてくれる生成AI(ChatGPT 4o、Perplexity Pro、etc.)をお使いでしたら、Pythonでpytsk3を使って、NTFSボリュームのファイル一覧をMFTから高速に取得するためのサンプルコードを教えてください。といった問いかけでサンプルを教えてくれるかと思いますので参考にしてみてください。

投稿2024/11/02 02:35

編集2024/11/02 09:13
segavvy

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

occhy

2024/11/02 13:49

回答ありがとうございます。 pytsk3ってなにものでしょうか。ググっても英語のよくわからないサイトしかヒットしませんでした。 日本語のサイトもサンプルもみつからず謎です。 生成AIがコードを書いてくれても、実行するのはリスキーな感じがしています。 MFTをみにいくというのは最速にはなるのだと思いますが、リスクも伴うと感じました。 質問は最速を希望しましたが、リスクが高いと定番にはならないとも思いました。 もう少し自分でも調べてみます。
segavvy

2024/11/02 15:17

> pytsk3ってなにものでしょうか。 pytsk3は、「The Sleuth Kit」というライブラリをPythonから使えるようにするものです。この「The Sleuth Kit」というのはディスクの解析をするためのライブラリです。 https://www.sleuthkit.org/sleuthkit/ > 生成AIがコードを書いてくれても、実行するのはリスキーな感じがしています。 生成AIに限らず、サンプルコードの中身を理解せずにそのまま実行するのは常にリスキーです。たとえば人が書いているteratailやQiitaのソースコードであっても、内容がおかしいことはあります。あくまでも実際にコードを書く際の参考に留めていただくのがよいかと思います。 > MFTをみにいくというのは最速にはなるのだと思いますが、リスクも伴うと感じました。 誤ったコード書いてしまうと被害が大きいという意味のリスクです。正しく理解すればアクセスすること自体にそれほどリスクはないかと思いますが、仕組みの理解に時間がかけられない場合は避けた方がよいかもしれません。 なお、MFTを見にいくアプリとしては、ファイル検索の「Everything」が有名です。 https://forest.watch.impress.co.jp/library/software/everything/ ご期待に沿った回答ができずすみません。何か多少でも参考になることがあれば幸いです。
guest

0

そんなに掛かるのか?と思ってやってみましたが、下記の通り約3分ですね。
Cドライブとお書きなので、「実はネットワークドライブだ」と言うことは無いと思うのですが。
ファイル一覧取得以外の処理に時間が掛かっているのに、ファイル一覧取得に時間が掛かっていると勘違いしているのではないでしょうか?

手元のPCは、CドライブはSSD 128GBなので、より時間の掛かりそうな Dドライブ HDD 1TB(90%くらい使用)でやってみました。

Python

1import glob 2import time 3n=0 4a=time.time() 5for f in glob.glob("**",root_dir="D:/",recursive=True): 6 n += 1 7print(n) 8print(int(time.time()-a))

結果は、1,221,032 個 196秒
glob.glob()は、巨大なリストを作るので遅いかと思い、glob.iglob()に変えてみましたが大差なし。

コマンドプロンプトのdirだと、

CMD

1echo %TIME% 2dir /s /b D:\ | find /c /v "" 3echo %TIME%

こちらは、1,244,533 個 44秒。
どちらもファイルだけでなくディレクトリーもカウントするので、個数の差は隠しファイルとかですかね。まあ、大勢に影響ないと思います。
ExplorerのD内の全フォルダーのプロパティーで個数を確認するとフォルダー込みで 1,245,703 なので個数は概ね合ってますね。こっちは 305秒もかかった!

segavvyさん回答にある、Everythingでも、C・Dドライブの情報データベース再構築に数分かかるようので大差ないかと思います。(一覧表示画面で、オプションから再構築ボタンを押して、一旦一覧が消えて再びファイル一覧が表示されるまでの時間。オプションで情報絞れば早くなるのかもですが)

投稿2024/11/03 05:05

otn

総合スコア85862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

occhy

2024/11/03 14:48

回答ありがとうございます。 僕が真似したコードはファイルを取得するごとにprintを実行していました。 それをやめたら300秒くらいで処理が完了しました。 ファイルを取得するごとに画面にファイル名を書き出していたのでそれは遅いはずです。 pythonの関数で頑張るより、コマンドプロンプトのDirを呼び出すのが合理的と思えてきました。 おかげさまでだいぶ見通しがついてきました。 もっとがんばってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問