본문 바로가기

Programming/Python

[Python]CSV 파일을 merge하는 방법

안녕하세요. 잇킹 시도르입니다.

오늘은 파이썬을 이용해서 여러 개의 CSV 파일을 하나의 파일로 만들어 보겠습니다.

 

CSV를 합치는 방법에는 pandas의 concat을 이용해서 하는 방법도 있습니다. 그런데 pandas를 이용하게 되면 큰 용량의 csv 파일을 dataframe으로 변환하면서 row memory 문제가 발생하더군요. 어쩌다가 3Gb 넘는 csv 파일들을 합칠 일이 생겨서 해보니 실패했었습니다. 그래서 순수하게 기본 csv 라이브러리만 사용해서 합쳐보려고 합니다.

 

merge 할 대상 파일은 3개로 준비했으며, 헤더가 없는 파일입니다.

▲대상 경로에 준비한 3개의 csv 파일

 

 

▲test1.csv

 

 

▲test2.csv

 

 

▲test3.csv

 

해당 파일이 존재하는 경로를 읽기 위해 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

▲최종 merge된 csv 파일

 

※만약 헤더가 있는 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

▲헤더를 포함해서 merge됨을 확인

 

이상입니다!!!