이전 포스팅에서는 파이썬(Python)의 Pandas 라이브러리를 활용하여 지저분한 엑셀 데이터의 빈칸(결측치)을 채우고 중복을 제거하는 전처리 기초를 알아보았습니다. 하지만 연구나 업무 현장에서는 데이터가 하나의 파일에 예쁘게 모여있는 경우가 거의 없습니다. 앞서 우리가 구축했던 'ArXiv 논문 자동 수집 봇'을 매일 아침 실행했다면, 일주일 뒤 우리 폴더에는 7개의 CSV 파일이, 한 달 뒤에는 30개의 CSV 파일이 흩어져 있게 됩니다. 이 30개의 파일을 열어서 복사하고 하나의 마스터(Master) 파일에 붙여넣는 작업은 생각만 해도 끔찍합니다. 마우스 스크롤을 잘못 내려 데이터가 한 칸 밀리기라도 하면 전체 통계가 망가지는 대참사가 벌어지죠. 이번 글에서는 파이썬의 'glob' 모듈과 Pandas의 'concat' 함수를 결합하여, 100개든 1,000개든 폴더 안에 있는 모든 CSV 파일을 단 1초 만에 완벽하게 하나로 합쳐주는 마법 같은 자동화 스크립트를 소개합니다.
1. 파일 검색의 마스터키: glob 모듈의 이해
수십 개의 파일을 파이썬으로 불러오려면, 먼저 파이썬에게 "이 폴더 안에 있는 파일들의 이름이 뭔지 다 찾아와"라고 명령해야 합니다. 이때 사용하는 것이 파이썬 내장 라이브러리인 glob입니다.
glob은 컴퓨터 내부를 돌아다니며 특정한 패턴을 가진 파일들의 경로를 리스트(List) 형태로 싹 쓸어오는 역할을 합니다. 예를 들어 glob.glob('./data/*.csv')라고 입력하면, data 폴더 안에 있는 파일 중 확장자가 csv로 끝나는 모든 파일의 이름을 찾아냅니다. 별표(*) 기호는 '앞에 어떤 이름이 오든 상관없이'라는 뜻의 와일드카드(Wildcard)입니다. 이 한 줄의 코드 덕분에 우리는 파일 이름이 매일 날짜별로 바뀌더라도 코드를 수정할 필요 없이 모든 데이터를 자동으로 인식할 수 있게 됩니다.
2. 수직으로 데이터 쌓기: Pandas concat() 함수의 위력
파일 이름들을 모두 찾았다면, 이제 엑셀 파일들을 열어서 레고 블록처럼 위아래로 쌓아 올릴 차례입니다. 엑셀 수작업의 'Ctrl+C, Ctrl+V'를 완벽하게 대체하는 함수가 바로 Pandas의 pd.concat()입니다. (Concatenate, 연쇄시키다라는 뜻입니다.)
반복문(For loop)을 돌면서 glob이 찾아온 파일들을 pd.read_csv()로 읽어 들인 후 임시 보관함(리스트)에 차곡차곡 담습니다. 모든 파일이 다 담기면, pd.concat() 함수가 이 보관함을 통째로 삼켜서 거대한 하나의 데이터프레임으로 압착시킵니다. 이때 컬럼(열) 이름이 같다면 알아서 같은 열 아래로 데이터를 매핑해주기 때문에, 파일마다 데이터의 순서가 조금 섞여 있어도 파이썬이 완벽하게 줄을 맞춰 줍니다.
3. 실전 파이썬 코드: 폴더 내 모든 CSV 파일 일괄 병합기
아래의 코드는 특정 폴더(예: daily_reports/) 안에 모여있는 수십 개의 일일 수집 논문 CSV 파일들을 읽어 들여, Master_Dataset.csv라는 하나의 거대한 통합 엑셀 파일로 병합해 주는 실전 스크립트입니다.
import pandas as pd
import glob
import os
# 1. 합칠 CSV 파일들이 모여있는 폴더 경로 지정
folder_path = './daily_reports/'
# 2. glob을 이용하여 해당 폴더 내의 모든 .csv 파일 경로를 리스트로 가져오기
# 예: ['./daily_reports/data_01.csv', './daily_reports/data_02.csv', ...]
file_list = glob.glob(os.path.join(folder_path, '*.csv'))
print(f"총 {len(file_list)}개의 CSV 파일을 발견했습니다. 병합을 시작합니다...")
# 3. 빈 리스트를 생성하여 개별 데이터프레임을 담을 준비
df_list = []
# 4. 반복문을 통해 파일을 하나씩 읽어서 리스트에 추가
for file in file_list:
try:
# csv 파일 읽기 (한글 깨짐 방지를 위해 인코딩 옵션 추가)
df = pd.read_csv(file, encoding='utf-8-sig')
df_list.append(df)
print(f"[읽기 성공] {os.path.basename(file)}")
except Exception as e:
print(f"[오류 발생] {file} 읽기 실패: {e}")
# 5. 리스트에 담긴 모든 데이터프레임을 수직(위아래)으로 병합
# ignore_index=True 옵션을 주어야 기존 파일들의 행 번호가 0부터 새롭게 정리됩니다.
master_df = pd.concat(df_list, ignore_index=True)
# 6. 병합된 최종 데이터를 새로운 CSV 파일로 저장
output_filename = 'Master_Dataset.csv'
master_df.to_csv(output_filename, index=False, encoding='utf-8-sig')
print(f"\n모든 파일 병합 완료! 총 데이터 개수: {len(master_df)}행")
print(f"결과 파일이 '{output_filename}' 이름으로 저장되었습니다.")
4. 코드 핵심 리뷰: ignore_index=True를 잊지 마세요
위 스크립트에서 병합을 수행하는 핵심 코드인 pd.concat(df_list, ignore_index=True) 부분을 주목해야 합니다. 만약 ignore_index=True라는 옵션을 빼먹는다면 어떤 일이 벌어질까요?
첫 번째 파일에 10개의 데이터(0~9번 행), 두 번째 파일에 10개의 데이터(0~9번 행)가 있었다고 가정해 봅시다. 이 옵션이 없으면 합쳐진 마스터 파일의 행 번호(Index)가 [0, 1, 2... 9, 0, 1, 2... 9] 처럼 기존 파일의 번호를 그대로 달고 와서 뒤죽박죽이 됩니다. 나중에 15번째 데이터를 찾고 싶어도 에러가 발생하죠. ignore_index=True를 선언해 주어야 파이썬이 기존의 꼬리표를 전부 떼버리고, 위에서부터 아래로 [0, 1, 2, ... 18, 19]까지 새로운 순번을 깔끔하게 부여해 줍니다.
결론: 퇴근 시간을 앞당기는 파이썬 자동화의 마법
오늘 배운 glob과 concat 함수의 조합은 비단 논문 데이터 수집에만 국한되지 않습니다. 공장의 센서에서 매일 생성되는 로그(Log) 파일을 하나로 묶거나, 각 부서에서 취합된 엑셀 보고서를 하나의 마스터 시트로 통합해야 하는 직장인들에게도 구세주 같은 코드입니다. 마우스 복사 붙여넣기로 한 시간이 넘게 걸릴 지루한 작업을 단 1초의 스크립트 실행으로 끝내 보십시오. 남는 시간에는 이전 포스팅에서 배운 Pandas의 drop_duplicates()를 활용하여 합쳐진 마스터 파일의 중복 데이터를 날려버리면, 완벽한 AI 학습용 데이터셋이 탄생할 것입니다.