폴더의 CSV 파일을 모두 로드

개요



csv 파일이 시기마다나 속성마다 나뉘어져 있거나 하는 경우가 있어, 그러한 파일을 한 줄로 읽어들일 수 있도록(듯이), 구현했습니다.
원하는 기능은 다음과 같습니다.
· 폴더의 csv 파일을 모두 읽습니다.
・지정의 문자를 포함한 csv파일만 대상으로 할 수도 있도록 한다.
· 하위 디렉토리도 포함할 수 있도록 한다.

실행 환경



・Windows10 64bit
· 파이썬 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건)을 모두 읽어들일 수 있었습니다.


 



이상, 열람 해 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기