フォルダ内のcsvファイルを全て読み込み


概要

csvファイルが時期毎や属性毎に分かれていたりする場合があり、それらのファイルを一行で読み込めるようにするべく、実装しました。
目的の機能は以下の通りです。
・フォルダ内のcsvファイルを全て読み込む。
・指定の文字を含むcsvファイルのみ対象とすることも出来るようにする。
・下位ディレクトリも含められるようにする。

実行環境

・Windows10 64bit
・Python 3.8.3
・pandas 0.25.3
・seaborn 0.11.0

実装

1.データ準備

irisデータ(150件)を4分割して、csvファイルとして保存(Eドライブ直下の"main"フォルダ)。また、"main"フォルダ内の”sub”フォルダにも同じファイルを保存。

import seaborn as sns
data = sns.load_dataset('iris')

import os
os.makedirs(r'E:\main', exist_ok=True)
for i in range(4):
    st = int(0 if i==0 else (len(data)/4)*i)
    en = int((len(data)/4)*(i+1))

    data.iloc[st:en].to_csv(r'E:\main\iris{}.csv'.format(i), encoding='cp932', index=False)


os.makedirs(r'E:\main\sub', exist_ok=True)
for i in range(4):
    st = int(0 if i==0 else (len(data)/4)*i)
    en = int((len(data)/4)*(i+1))

    data.iloc[st:en].to_csv(r'E:\main\sub\iris{}.csv'.format(i+4), encoding='cp932', index=False)

2.csvファイル読み込み

結果としては、以下の関数にて実装しました。

import glob
import pandas as pd
def read_csv(path, encode, sub_check=False, target_name=None):
    #フォルダ内全てのcsvファイルのパスをlistで取得
    #sub_check=Trueならサブフォルダまで対象
    target_files = glob.glob(path+r'\**\*.csv', recursive=True) if sub_check else glob.glob(path+r'\*.csv')

    #結合後のファイル格納用
    merged_file = pd.DataFrame()

    #対象のcsvファイルを全て結合
    for filepath in target_files:

        #ファイル名に指定の文字を含まなければ対象外とする
        filename = filepath.split('\\')[-1]
        if target_name!=None and target_name not in filename: continue        

        #一つのcsvファイルを読み込み
        input_file = pd.read_csv(filepath, encoding=encode, sep=",", engine='python')

        #一つのcsvファイルを今までに読み込んだcsvファイルへ結合
        merged_file = pd.concat([merged_file, input_file], axis=0)

    #結合後のDataFrameのindexをリセット
    merged_file = merged_file.reset_index(drop=True)

    return merged_file

動作確認

1.一つのフォルダ内のcsvファイル読み込み

一つのフォルダ内のcsvファイル(150件)を全て読み込めました。

2.一つのフォルダ内のcsvファイルで指定ファイルのみ読み込み

target_nameに"1"を指定すると、名前に”1”を含むcsvファイル(38件)を読み込めました。

3.下位ディレクトリも含めてファイル読み込み

sub_check=Trueとすれば、下位ディレクトリの"sub"フォルダも含めて、csvファイル(300件)を全て読み込めました。

 

以上、閲覧頂きありがとうございました。