■はじめに
・特定の拡張子をもつファイルパスを全て取得したい
・ファイル名に指定した文字列を含むファイルパスを全て取得したい
・ディレクトリの階層にかかわらず、指定した特徴を持つファイルパスを全取得したい
以上、3つの要望を満たす処理を
普段の業務効率化ツールの実装でよく使うので、
同様の処理にお困りの方へ、ご参考いただければと思います。
■お急ぎの方へ、一先ず全文公開
import os
import glob
from tkinter.filedialog import askdirectory
def GetFilePath():
dirBase = askdirectory(title='CSVファイルをまとめた親フォルダを選択してください。')
dirpath = dirBase + '\\*'
pathList = glob.glob(dirpath)
#取得したCSVファイルを格納するためのリスト
fpathList = []
#選択したディレクトリ以下のディレクトリでCSVファイルを全て取得する。
for p in pathList:
if os.path.isdir(p):
plist = glob.glob(p+'\\*')
pathList.extend(plist)
elif p[-3:] == 'csv':
fpathList.append(p)
else:
pass
return fpathList
■処理の流れ
ポイントだけピックアップして説明します。
1.tkinterのaskdirectoryを用いて、
任意のフォルダを選択できるフォルダ選択ダイアログを開きます。
from tkinter.filedialog import askdirectory
dirBase = askdirectory(title='CSVファイルをまとめた親フォルダを選択してください。')
2.1で選択したディレクトリパスの1階層下にあるファイルやディレクトリのパスをglobで取得。pathListは、ファイルやディレクトリの絶対パスを含むlist型の変数です。
import glob
dirpath = dirBase + '\\*'
pathList = glob.glob(dirpath)
3.後の処理で"狙った"ファイルパスを追加するためのリストを用意。
#指定した条件にマッチしたファイルを格納するためのリスト
fpathList = []
4.2で取得したpathListのパスをfor文で1つ1つ見ていきます。
ここの処理では、ディレクトリパスを避けつつ、どんなファイルを取得したいかを指定します。
import os
for p in pathList:
if os.path.isdir(p):
plist = glob.glob(p+'\\*')
pathList.extend(plist)
elif p[-3:] == 'csv':
fpathList.append(p)
else:
pass
【if~】
①最初に、取得したパス(p)が、ディレクトリかどうか判断。
②ディレクトリパスの場合、更に1階層下に存在するパスをリスト(plist)にして、pathListに結合。
▶②により、ディレクトリパスが出てきても、最初のfor文でその配下の全パスを読み込むことができます。
【elif~】
ここの処理に入ってくるパスは全てファイルパス。
条件式では、取得したいファイルが持つ文字列の特徴を指定してください*。
*例文では、拡張子が「csv」であるパスを指定しています。
【else~】
ここに入ってくるは、ディレクトリパスでもなく、
上記の条件に当てはまらないファイルパス。
使わないパスは、passしましょう。
return fpathList
以上の処理を通して、
指定した特徴を持つファイルパスのみが、fpathListに入ってくるので、最後にreturn。
■まとめ
Pythonで「各ディレクトリからファイル名に特定の文字列をもつファイルパスを全て取得する」ための処理の紹介でした。
もし、もっとスマートなロジックがございましたら、是非ともフィードバックお願い申し上げます。
以上です!