search
LoginSignup
28

More than 1 year has passed since last update.

posted at

フォルダ内の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件)を全て読み込めました。
image.png

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

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

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

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

 

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
28