폴더의 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건)을 모두 읽어들일 수 있었습니다.
이상, 열람 해 주셔서 감사합니다.
Reference
이 문제에 관하여(폴더의 CSV 파일을 모두 로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/key9asm4/items/67f6de7919496194646d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
・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건)을 모두 읽어들일 수 있었습니다.
이상, 열람 해 주셔서 감사합니다.
Reference
이 문제에 관하여(폴더의 CSV 파일을 모두 로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/key9asm4/items/67f6de7919496194646d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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)
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건)을 모두 읽어들일 수 있었습니다.
이상, 열람 해 주셔서 감사합니다.
Reference
이 문제에 관하여(폴더의 CSV 파일을 모두 로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/key9asm4/items/67f6de7919496194646d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(폴더의 CSV 파일을 모두 로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/key9asm4/items/67f6de7919496194646d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)