読者です 読者をやめる 読者になる 読者になる

Subdirectoryのfileまでを自動的に獲得

例えば、ファイルが大量にあって、そのすべてに同じ処理を施した時、しかも、階層構造になっている。
こんな時には、
・ファイルを全部くっつけてまとめて処理してしまう(テキストファイルだと割と使える手)
・連続的にファイルを処理する

があるけど、メンテナンス性から言って後者の方がはるかにいい。

bashスクリプトを書いて、連続的に処理を行ってもよいのだが、ここではせっかくなので、pythonの中ですべてを記述したい。

こういう時に利用するのは os.walk(path)である。
参考にしたのは
http://kbdpage.blog82.fc2.com/blog-entry-19.html
http://abalone.ununu.org/archives/350

動作の詳しいところは、参考ページを見ればよいので、とりあえず動かす時には、

def get_dir_name(dir_name):
    for root,dirs,files in os.walk(path_to_dir):
        for f in glob.glob(os.path.join(root,'*.py')):
            print f

という関数を使えばいい。
簡単な動作の流れは
・os.walk(dir_name) が返すのはインスタンス.このインスタンスには3つのattributeがあって,
rootが指定したdir_nameのフルパス(型:文字列)
dirsが指定したdir_name以下にあるサブディレクトリの一覧(型:リスト)
filesが指定したパス以下のファイルの一覧(型:リスト)

このとき,指定したパスの下には直にファイルがあるだけならば.
・os.walkの返り値のうちrootとfilesのみを使う。os.path.joinに、この2つを渡してやるとパスが返ってくる(相対パス
相対パスをリストに突っ込んでいって、最後にリストを返す

とまあ、こんな感じ。
他にもos.walk()+glob.glob()の組み合わせ、os.walk()+os.listdir() の組み合わせもいけるっぽいので、その辺りは参考ページを。