Programming/Python

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

시도르 2020. 3. 19. 01:33

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

오늘은 파이썬을 이용해서 여러 개의 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됨을 확인

 

이상입니다!!!