안녕하세요. 잇킹 시도르입니다.
오늘은 파이썬을 이용해서 여러 개의 CSV 파일을 하나의 파일로 만들어 보겠습니다.
CSV를 합치는 방법에는 pandas의 concat을 이용해서 하는 방법도 있습니다. 그런데 pandas를 이용하게 되면 큰 용량의 csv 파일을 dataframe으로 변환하면서 row memory 문제가 발생하더군요. 어쩌다가 3Gb 넘는 csv 파일들을 합칠 일이 생겨서 해보니 실패했었습니다. 그래서 순수하게 기본 csv 라이브러리만 사용해서 합쳐보려고 합니다.
merge 할 대상 파일은 3개로 준비했으며, 헤더가 없는 파일입니다.
해당 파일이 존재하는 경로를 읽기 위해 glob 라이브러리를 사용했습니다.
merge 스크립트는 아래와 같습니다.
import csv
import glob
path = 'D:/My_Blog/20200318/file/' #CSV 파일이 존재하는 경로
merge_path = 'D:/My_Blog/20200318/merge.csv' #최종 Merge file
file_list = glob.glob(path + '*') #1. merge 대상 파일을 확인
with open(merge_path, 'w') as f: #2-1.merge할 파일을 열고
for file in file_list:
with open(file ,'r') as f2:
while True:
line = f2.readline() #2.merge 대상 파일의 row 1줄을 읽어서
if not line: #row가 없으면 해당 csv 파일 읽기 끝
break
f.write(line) #3.읽은 row 1줄을 merge할 파일에 쓴다.
file_name = file.split('\\')[-1]
print(file.split('\\')[-1] + ' write complete...')
print('>>> All file merge complete...')
해당 스크립트를 실행하면 다음과 같이 하나로 합쳐진 csv 파일을 확인할 수 있습니다.
<파이썬 결과>
C:\Anaconda3\envs\sidorl\python.exe D:/My_DEV/basic_dev/run/merge_csv.py
test_1.csv write complete...
test_2.csv write complete...
test_3.csv write complete...
>>> All file merge complete...
Process finished with exit code 0
※만약 헤더가 있는 CSV 파일들을 merge 해야 한다면 어떻게 해야 할까요?
저는 첫 번째 csv 파일은 헤더를 포함해서 그대로 쓰고, 이후 파일부터는 헤더인 row를 제외하고 쓰는 방법으로 선택했습니다.
import csv
import glob
path = 'D:/My_Blog/20200318/file2/'
merge_path = 'D:/My_Blog/20200318/merge.csv'
file_list = glob.glob(path + '*') # 1. merge 대상 파일을 확인
with open(merge_path, 'w') as f: # 2-1.merge할 파일을 열고
for i, file in enumerate (file_list):
if i ==0: ### 처음 파일은 헤더 포함해서 write
with open(file, 'r') as f2:
while True:
line = f2.readline() # 2.merge 대상 파일의 row 1줄을 읽어서
if not line: # row가 없으면 해당 csv 파일 읽기 끝
break
f.write(line) # 3.읽은 row 1줄을 merge할 파일에 쓴다.
file_name = file.split('\\')[-1]
print(file.split('\\')[-1] + ' write complete...')
else:
with open(file, 'r') as f2:
n = 0 #csv 파일의 row를 체크하기 위한 변수
while True:
line = f2.readline() # 2.merge 대상 파일의 row 1줄을 읽어서
if n != 0: # 첫번째 row(헤더)를 제외한
f.write(line) # 3.읽은 row 1줄을 merge할 파일에 쓴다.
if not line: # row가 없으면 해당 csv 파일 읽기 끝
break
n += 1
file_name = file.split('\\')[-1]
print(file.split('\\')[-1] + ' write complete...')
print('>>> All file merge complete...')
결과는 다음과 같습니다.
C:\Anaconda3\envs\sidorl\python.exe D:/My_DEV/basic_dev/run/merge_csv_header.py
test_1_header.csv write complete...
test_2_header.csv write complete...
test_3_header.csv write complete...
>>> All file merge complete...
Process finished with exit code 0
이상입니다!!!
'Programming > Python' 카테고리의 다른 글
[Python]SSL Error 발생 시에 pip install 방법 (0) | 2020.10.26 |
---|---|
[Python]폴더들의 하위 파일 이동/파일 복사(glob,shutil) (0) | 2020.03.23 |
[Python]파이썬에 cx_oracle import 에러 해결하기 (0) | 2020.02.08 |