MENU

もう迷わない!再帰関数で深層フォルダを瞬速探索するPythonプログラムの書き方

深夜2時。部屋の照明はモニターの光だけで、目の前には数えきれないほどのフォルダとファイルが広がっていました。顧客から緊急の依頼。「あのプロジェクトのログファイルから、特定の期間のエラーコードを全て抽出してほしい」。しかし、そのファイルは複雑な階層構造の奥深くに隠されており、手動で一つ一つ開いていくには、途方もない時間がかかることがすぐに分かりました。

「こんなはずじゃなかった…」

私は焦りと絶望で、心の中で叫んでいました。マウスを握る指は腱鞘炎になりそうに痛み、カフェインを過剰摂取したせいで心臓がバクバク音を立てています。単純なループ処理で試みましたが、サブフォルダの中身まで辿り着けず、結局は手作業の延長にしかなりませんでした。

「もうダメだ…徹夜しても終わらない。このままじゃ顧客に迷惑がかかる。なぜこんな簡単なことすらできないんだ、と自分を責めました。」

あの時の私は、プログラミングの学習を始めたばかり。目の前の大量のデータという“迷宮”に囚われ、無力感に苛まれていました。まさに、プログラミング初心者誰もが一度はぶつかる壁、「フォルダの深い階層をどうやって効率的に探索するか」という問題に直面していたのです。

なぜ「再帰関数」が必要なのか?

手作業でのフォルダ探索が非効率なのは明白です。しかし、なぜプログラミングを使っても、単純なループ処理では限界があるのでしょうか?それは、フォルダが「フォルダの中にフォルダ」を持つという、まるでロシアンドールのような構造をしているからです。一番外側のフォルダだけを調べても、その内側に隠された無限の可能性を見落としてしまいます。

ここで登場するのが「再帰関数」です。

再帰関数とは、まるで探偵が事件現場を捜査するように、あるフォルダに入ったら、まずそのフォルダ内にある手がかり(ファイル)を全て調べ、もしそのフォルダ内に別の部屋(サブフォルダ)へのドアがあれば、そこに入って同じように捜査を続ける、というロジックです。手がかりが尽きるまで、このプロセスを繰り返すことで、どんなに深い階層の迷宮でも確実に探索し尽くすことができるのです。

再帰関数でフォルダを探索するPythonプログラムの書き方

あの夜、私は先輩エンジニアのブログ記事で「再帰関数」という言葉に出会いました。最初は難解に感じましたが、「玉ねぎの皮を剥くように、内側へ内側へと進んでいく」という比喩で、その本質を直感的に理解できました。

Pythonを使えば、この強力な再帰関数を驚くほどシンプルに実装できます。ここでは、osモジュールと組み合わせて、指定したフォルダ以下の全てのファイルとフォルダを探索するプログラムを紹介します。

“`python

import os

def explore_directory(path):

print(f”探索中: {path}/”)

try:

for item in os.listdir(path):

item_path = os.path.join(path, item)

if os.path.isdir(item_path):

フォルダであれば、再帰的に自身を呼び出す

explore_directory(item_path)

else:

ファイルであれば、ファイル名を表示

print(f” ファイル: {item_path}”)

except PermissionError:

print(f” 権限エラー: {path} にアクセスできませんでした。”)

except Exception as e:

print(f” エラー発生: {e} @ {path}”)

探索を開始するルートディレクトリを指定

例: explore_directory('/Users/yourname/Documents/MyProject')

例: explore_directory('C:\Users\yourname\Documents\MyProject')

実行する際は、以下の行のコメントアウトを外し、適切なパスを指定してください

explore_directory('./my_test_folder') # 現在のディレクトリ下の'my_test_folder'を探索

“`

コード解説:

1. explore_directory(path)関数が、与えられたpath(フォルダのパス)を探索します。

2. os.listdir(path)で、そのフォルダ内の全てのファイルとフォルダの名前を取得します。

3. それぞれの項目について、os.path.isdir(item_path)でそれがフォルダかどうかを判定します。

4. もしフォルダであれば、explore_directory(item_path)と、この関数自身を呼び出します。 これが再帰の核心です。新しいフォルダに入ったら、また同じように探索を続けるわけです。

5. もしファイルであれば、そのファイル名を表示します。ここでは単に表示するだけですが、実際にはファイルの中身を読み込んだり、特定の条件でファイルをコピーしたりといった処理を追加できます。

6. try-exceptブロックで、権限エラーなどが発生した場合にもプログラムが停止しないようにしています。

再帰関数を使いこなすためのヒントと注意点

このコードを動かした時、私は鳥肌が立ちました。あの徹夜の悪夢が嘘のように、一瞬で目的のファイルリストが目の前に現れたのです。あの時の自分を救ってくれたのは、このシンプルなロジックだったのか、と。もう二度と、あの絶望感を味わうことはない、と確信しました。

再帰関数は、コードを驚くほど簡潔にし、複雑な問題をエレガントに解決する力を持っています。しかし、強力なツールには常に注意が必要です。

  • 無限ループの回避: 再帰関数は、必ず「終了条件」が必要です。今回の例では、フォルダ内にサブフォルダがなくなれば自然と終了します。もし終了条件がないと、無限に自身を呼び出し続け、プログラムがクラッシュ(スタックオーバーフロー)する可能性があります。
  • メモリ消費: 深い階層を探索する場合、再帰の呼び出し回数が多くなると、メモリを大量に消費する可能性があります。Pythonには再帰の深さ制限(デフォルトで1000回程度)があるため、非常に深い階層構造では注意が必要です。

あなたのプログラミングの常識を覆す一歩

再帰関数は、単なるプログラミング技法ではありません。それは、複雑な問題を「小さな同じ構造の問題」に分解し、それを繰り返すことで全体を解決する、という普遍的な問題解決のアプローチそのものです。

あの夜、再帰関数を知らなかった私は、文字通り途方に暮れていました。しかし、この概念を理解し、実際にコードを書けるようになった今、どんなに深いデータ構造も恐れることはありません。あなたはもう『見つからない』と諦める必要はありません。

この再帰関数をマスターすることは、あなたのプログラミングスキルを次のレベルへ引き上げ、データ管理における「賢者」へと変貌させる鍵となるでしょう。さあ、あなたもこの強力なツールを手に入れ、データ迷宮の探検家として、新たな一歩を踏み出しましょう。