例えば、test1.csv、test2.csv、test3.csvというファイルがあった場合、
files = ["test1.csv", "test2.csv", "test3.csv"]
といった具合に読み込ませるためにリストにしてfor文を回して読み込ませると一気に読み込ませられると思います。
しかし、この例ではtest1.csv、test2.csv、test3.csvという3つのファイルだけで済んでいますが、これが1000ファイルとかの量だとどうでしょうか。
for文で回す前に、pythonプログラムにfilesとしてリストを書くだけで大変な作業になりそうです。
こんな時はどうすればよいのでしょうか?🤔
今回は複数のcsvファイルをdataframeとして読み込むプログラムを載せます。
ステップ①:csvファイル分のdataframeを準備
今回のポイントは複数のcsvをdataframeとして読み込ませるという事は、複数のcsvファイルそれぞれに対してdataframeを一つずつ用意する必要があるという事です。
つまり1000個のcsvファイルがあった場合、1000個のdataframeを用意する必要があります。
まずは、そのcsvファイル分のdataframeを用意するプログラムから記します。
正確にはcsvファイル分のdataframeの名前を用意します。以下のようになります。
import os
import pandas as pd
data_path = "./test"
filenames = os.listdir(data_path)
df_names = []
for name_item in filenames:
temp_name = name_item.replace(".csv", "")
df_names.append("df_" + temp_name)
pandasはこのあと使います。
data_pathは今回はpythonプログラムの同階層にあるtestという名前のフォルダ内にcsvファイルが格納されているという状況を想定しています。
filenames = os.listdir(data_path)
のところでdata_path配下(今回はtestフォルダ配下)のファイル名をfilenamesというリストに格納しています。
はい、ここまでで、ファイル名が格納されたリストfilenamesと、dataframe用の名前が格納されたリストdf_namesができました。
次はこの2つのリストを使ってdataframeを作っていきます。
ステップ②:dataframeを作る
df_namesとfilenamesのリストを同時にループで回して、filenamesのファイル名のcsvからdf_namesのdataframe名のdataframeを作っていきます。
以下のようになります。
for (df_item, name_item) in zip(df_names, filenames):
path = data_path + "/" + name_item
code = '{} = pd.read_csv("{}")'.format(df_item, path)
exec(code)
ポイントとしてはまず、2つのリストをfor文で同時に回すには「zip」を使います。
そしてpythonコード内に変数を使う部分は以下のところです。
code = '{} = pd.read_csv("{}")'.format(df_item, path)
exec(code)
ここは、csvファイルからdataframeを作成しているのですが、本来であれば
df_test1 = pd.read_csv("test1.csv")
のようになりますが、今回はtest1とdf_test1の部分が変数として値が変わるのでcodeを変数ごとに定義してexec(code)で実行するようにしています。これでファイル全てに対してそれぞれに対応したdataframeを生成できます。
全体のプログラム
全体のプログラムは以下のようになります。
import os
import pandas as pd
data_path = "./test"
filenames = os.listdir(data_path)
df_names = []
for name_item in filenames:
temp_name = name_item.replace(".csv", "")
df_names.append("df_" + temp_name)
for (df_item, name_item) in zip(df_names, filenames):
path = data_path + "/" + name_item
code = '{} = pd.read_csv("{}")'.format(df_item, path)
exec(code)