この記事以外にもPythonによる仕事効率化の記事を公開しています。
はじめに
今回は、特定のディレクトリ内にあるファイルをすべて読み込む方法を扱います。ログファイルが複数り、順番に読み込む、ということもありますよね。手作業でやるのはとても大変ですが、決まった作業はプログラムの得意な仕事です。このやり方を習得しましょう。
ファイル名を取得する
まずはディレクトリ内にあるファイルを特定する必要があります。ファイルパスを取得するにはglob1ライブラリのglob関数を使います。
# ライブラリの読み込み
import glob
glob()関数の引数としてパターンを与えると、指定したディレクトリ内でパターンにマッチするファイルパスを返してくれます。
glob.glob(dir + '\*')
これで、現在のディレクトリからみて、指定したディレクトリ「dir」配下のすべてのファイルパスを取得することができます。取得したファイルパスのリストをpath_listという変数に入れておくことにしましょう。
path_list=glob.glob(dir + '\*')
ここで取得したファイルパスから、「ファイル名(拡張子なし)」だけのリストも作っておきましょう。
name_list=[]
for i in path_list:
file = os.path.basename(i) # ファイル名(拡張子あり)を取得
name, ext = os.path.splitext(file) # 拡張子なしファイル名と拡張子を取得
name_list.append(name) # 拡張子なしファイル名をリスト化
これでpath_listとname_listを作ることができます。これを関数として定義しておくと便利ですね。
現在いる位置からみえるディレクトリを指定すると、そのディレクトリ配下のすべてのファイルを対象として、「パス名のリスト」と「(拡張なしの)ファイル名のリスト」を作る関数を作ることにしましょう。
# 指定したディレクトリ配下のファイルを探す関数
def filesearch(dir):
path_list = glob.glob(dir + '\*') # 指定dir内の全てのファイルを取得
# パスリストからファイル名を抽出
name_list = []
for i in path_list:
file = os.path.basename(i)
name, ext = os.path.splitext(file)
name_list.append(name)
return path_list, name_list
このようにしておけば、たとえば「data」というディレクトリにあるファイルに関して、パスリストと(拡張子なしの)ファイル名」リストは次のように取り出すことができます。
# ファイル情報を取得する関数を実行
path_list, name_list = filesearch('data')
ファイルを読み込む
パスリストができているので、順にファイルを読み込むのは簡単ですね。次のようにあらかじめ空のデータフレームを用意しておき、ここに読み込んだファイルを「連結」していくことにしましょう。
※今回のファイルはすべて同じフォーマットのテーブルデータと考えてください。
# ディレクトリ配下のファイルを読み込む
_data=pd.DataFrame()
for file,name in zip(path_list,name_list):
tmp=pd.read_csv(file)
_data=pd.concat([_data,tmp],sort=True)
まとめ
いかがでしょうか?まずは、ディレクトリ内のファイルのパスのリストを作る。これにはglobというライブラリのglob()関数を用いました。次に、作成したパスリストをもとに順に、ファイルをよクトリ内のファイルのパスのリストを作る。これにはglobというライブラリのglob()関数を用いました。次に、作成したパスリストをもとに順に、ファイルを読み込み「連結」しました。
データが複数のファイルにわかれて提供される場合、一つ一つ読み込むのは面倒なので、是非、覚えておきましょう。
コメント
読み込まなくていいんで別フォルダに全て同名でコピーするにはどうやるんですか?
readしなくていいんで
コピーするだけならshutilモジュールを使うとよいです。
import shutil
shutil.copy(‘ファイル名(コピー元)’,’ファイル名(コピー先)’)
ファイルをパスで指定すれば、ディレクトリ配下のファイルを、別のディレクトリにコピーできます。
ディレクトリ配下をすべてコピーしたければ、globで取得したファイルを対象にして、
for文を回すことで簡単にできます。