はじめに
今回はPythonライブラリのosモジュールとglobモジュールを扱います。osモジュールはosに依存する機能を利用するためのものです。globは指定したパターンにマッチするファイルパスを取得することができます。これらを組み合わせてフォルダ内のファイル処理するときなどに使います。
モジュール
冒頭に記載し対応に、osに依存する機能を使うためのモジュールです。いろんなメソッドがありますが、まずは次の3つを知っておけばよいかと思います。
- os.getcwd( )
現在参照しているディレクトリ(カレントディレクトリ)のパスを取得する - os.listdir( )
ファイルやディレクトリの一覧を取得する。デフォルトではカレントディレクトリを対象としますが、引数で対象とするディレクトリを指定することができます。 - os.path( )
ファイルやディレクトが指定したパスに存在するかを確認したり、パスからファイル名や拡張子を取得したりなどをおこないます。os.path( )1のあとにさらにメソッドを続けて使います。
– os.path.exists( ):存在するか
– os.path.isdir( ):ディレクトリであるか
– os.path.isfile( ):ファイルであるか
-os.path.split( ):パスとファイル名を返す
-os.path.splitext( ):拡張子を除いたファイル名までのパスと拡張子を返す
– os.path.join( ):パスとファイル名を結合する
globモジュール
globモジュールは、指定したパターンにマッチするファイルパス名を取得することができるので、特定のディレクトリにあるファイルに処理を加えたいときなどに使えます。
例えば、カレントディレクトリ配下に「sample」というディレクトリがあり、この中で「csv」という拡張子のファイルのファイルパス名を取得したい場合は、次のようにします。
glob.glob('sample\\*csv')
具体的なファイル名がわからなくても、「*csv」のように指定することができて、この部分の表現にマッチするものを探してくれます。
ディレクトリ内のファイルを一覧化する
osモジュールとglobモジュールの基本がわかったところで、実際に使ってみることにしましょう。ここでは、「sample」というディレクトリにあるファイルを一覧化することにしましょう。
あるディレクトリ配下にあるディレクトリやファイル名を調べるだけで張れば、os.listdir( )でしたね。
os.listdir('sample')
「sample」というディレクトリに3つのファイルがあることがわかりました。これらは各月のデータになっています。このファイルを読み込むことを考えてみましょう。ここではファイルは3つですが、10個、20個あった場合は一つずつ指定して読み込むのは現実的ではないですね。
ファイルをまとめて読み込む
ファイルをまとめて読み込むには、そのファイルのパスがわかっている必要があります。ファイルのパスは、「ファイルが存在するディレクトリのパス」+「ファイル名」なので、前者はos.getcwd( )で取得することができ、後者はファイル名に規則性があれば、glob( )を使ったパターンマッチで取得することができるでしょう。
# カレントディレクトリの取得
current_dir=os.getcwd()
# ファイルのパスのパターン作成
pattern=os.path.join(current_dir,'sample','visit_date_2020_*csv')
# ファイルのパス
file_path=glob.glob(pattern)
file_path
これで読み込みたいファイルのパスが作成できました。あとはfor文で順に読み込んでいくことにしましょう。
# データを格納するデータフレームを準備
all_data=pd.DataFrame()
# 順に読み込む
for path in file_path:
tmp_data=pd.read_csv(path)
all_data=pd.concat([all_data,tmp_data],axis=0,ignore_index=True)
print(len(all_data))
all_data.head()
無事読み込めてそうですね。念のためデータの末尾も見ておきましょう。
all_data.tail()
2020/10/1~2020/12/31までのデータを無事取り込むことができました。
まとめ
いかがでしたか?データが複数のファイル分けて提供されることは結構ありますよね。月次データだったり、支店別のデータだったり。フォーマットがそろっていれば、ファイルが分かれていてももう怖くありませんね。
コメント