ファイル処理を行うときには、あるディレクトリ内のファイルを探索して処理対象ファイルを見つける処理を行うことがある。
この処理をPythonで行う方法をいつも忘れるので、覚え書きとしてここに書いておく。
ディレクトリリスティングをする際に使うモジュールは、globモジュールとosモジュール。
まずは、globモジュール。glob.glob()メソッドを利用する。
import glob
print "glob ----"
for file in glob.glob('*.py'):
print file
これをPythonの勉強に使っているディレクトリで実行すると以下のようになる。
glob ---- call_func.py define_func.py dirList.py dt_copy.py dt_tz.py factor.py from_main.py from_test.py list_remove.py pmain.py ptest.py regular.py trq.py
カレントディレクトリにある拡張子pyのファイル名を全て探し出してリスト化してくれる。
サブディレクトリをパターンに指定するとサブディレクトリも検索可能。
print "glob(2) ----"
for file in glob.glob('./*/*.py'):
print file
これを先ほどと同じディレクトリで実行した結果は、次の通り。
glob(2) ---- ./test/test.py
glob.glob()メソッドの引数に、’./*/*.py’を渡しているので、カレントディレクトリに存在するpyファイルはリスト化されてこない。さらに、testディレクトリ以下にはtest2ディレクトリが存在して、その中にもpyファイルを置いてあるのだが、それもリスト化はされない。
次にos.walk()メソッドを使ってみる。
print "walk ----"
for root, dirs, files in os.walk('.'):
for file in files:
print os.path.join(root,file)
この結果は以下のようになる。
walk ---- ./#yes# ./.DS_Store ./builtin_obj.txt ./call_func.py ./define_func.c ./define_func.py ./define_func.pyc ./dirList.py ./dirList.py~ ./dt_copy.py ./dt_copy.py~ ./dt_tz.py ./factor.py ./from_main.py ./from_test.py ./from_test.pyc ./list_remove.py ./list_remove.py~ ./myfile ./pmain.py ./ptest.py ./ptest.pyc ./regular.py ./trq.py ./test/test.py ./test/test2/test2.py
os.walk()は、引数のディレクトリ以下のファイルを全て拾い出す。
返値は、root, dirs, files の三つ。root に、files リストに格納されているファイル名をos.path.join()メソッドで連結すると、ディレクトリ名を付加したファイル名を取得できる。
dirsにはディレクトリ名が格納される。
glob.glob()と、os.walk()を組み合わせると、任意のディレクトリ以下に存在するパターンにマッチするファイルを探索可能。
print "walk+glob ----"
for root, dirs, files in os.walk('.'):
for file in glob.glob(os.path.join(root,'*.py')):
print file
出力結果は以下のようになる。
walk+glob ---- ./call_func.py ./define_func.py ./dirList.py ./dt_copy.py ./dt_tz.py ./factor.py ./from_main.py ./from_test.py ./list_remove.py ./pmain.py ./ptest.py ./regular.py ./trq.py ./test/test.py ./test/test2/test2.py
os.walk()だけのときと違ってバックアップファイルとかは含まれていない結果が得られる。
もっと処理の軽い方法があるのかもしれないが、とりあえずはこれで。
トラックバックURL
[...] とりあえず上記関数と、以前に書いたディレクトリリスティングに加え、ファイルがディレクトリかどうかを判定できる関数があればとりあえずあちこち見て回れる。ディレクトリかど [...]
コメントをどうぞ




by あるエンジニアの不定期ブログ 2010-02-23 1:22:10