■python備忘録 #4 「複数のcsvファイルの名前からlistを作る」

スポンサーリンク
tech系(python)
スポンサーリンク

例えば、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)

タイトルとURLをコピーしました