흩어진 CSV 파일 한번에 합치고 정리하기! 파이썬 자동화

흩어진 CSV 파일 한번에 합치고 정리하기! 파이썬 자동화 (완성 코드 공개)

파이썬으로 여러 CSV 파일을 자동으로 합치고 정리하는 모습


"네이버 쇼핑, 쿠팡, 스마트스토어에서 각각 내려받은 주문 CSV 파일을 하나로 합쳐야 한다", "구글 애널리틱스에서 월별로 내려받은 CSV 파일 12개를 연간 데이터로 만들어야 한다"…

CSV 파일은 엑셀보다 가볍고 다양한 서비스에서 지원하기 때문에 실무에서 자주 사용됩니다. 하지만 여러 곳에서 내려받은 CSV 파일을 합칠 때 인코딩이 달라 글자가 깨지거나, 중복 데이터가 섞이거나, 빈 행이 끼어드는 문제가 생깁니다. 파이썬을 한 번만 세팅해두면 이런 문제를 자동으로 해결하면서 CSV 파일을 깔끔하게 합치고 엑셀로 저장할 수 있습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install pandas openpyxl chardet

pandas는 CSV 파일을 읽고 합치고 정리하는 모든 작업을 처리합니다. openpyxl은 결과를 엑셀 파일로 저장할 때 사용하고, chardet은 CSV 파일의 인코딩을 자동으로 감지해 한글 깨짐을 방지합니다.

💡 이 코드로 할 수 있는 것: 폴더 안의 모든 CSV 파일을 자동으로 인코딩 감지 후 읽어 하나로 합칩니다. 중복 행 자동 제거, 빈 행 정리, 출처 파일명 열 자동 추가, 결과를 CSV와 엑셀 동시 저장까지 한 번에 처리합니다.

2단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, merge_csv.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

import pandas as pd
import chardet
from pathlib import Path

# ① 설정
FOLDER_PATH    = r"C:\Users\내이름\Desktop\CSV모음"          # ← CSV 파일이 있는 폴더
OUTPUT_CSV     = r"C:\Users\내이름\Desktop\합쳐진_데이터.csv"  # ← 저장할 CSV 경로
OUTPUT_XLSX    = r"C:\Users\내이름\Desktop\합쳐진_데이터.xlsx" # ← 저장할 엑셀 경로
REMOVE_DUPLICATES = True   # ← True: 중복 행 자동 제거
DROP_EMPTY_ROWS   = True   # ← True: 모든 열이 빈 행 자동 제거
ADD_SOURCE_COL    = True   # ← True: 어느 파일에서 왔는지 "출처파일" 열 추가

# ② 인코딩 자동 감지 함수
def detect_encoding(filepath):
    with open(filepath, "rb") as f:
        result = chardet.detect(f.read(10000))
    encoding = result.get("encoding", "utf-8") or "utf-8"
    # 한국어 CSV 흔한 인코딩 보정
    if encoding.lower() in ("euc-kr", "cp949", "iso-8859-1"):
        return "cp949"
    return encoding

# ③ 폴더 안의 모든 CSV 읽기
folder    = Path(FOLDER_PATH)
csv_files = sorted(folder.glob("*.csv"))
print(f"  📂 발견된 CSV 파일: {len(csv_files)}개")

if not csv_files:
    print("⚠ CSV 파일을 찾을 수 없습니다. FOLDER_PATH를 확인하세요.")
else:
    all_data = []
    for csv_file in csv_files:
        try:
            enc = detect_encoding(csv_file)
            df  = pd.read_csv(csv_file, encoding=enc, on_bad_lines="skip")
            if ADD_SOURCE_COL:
                df["출처파일"] = csv_file.name
            all_data.append(df)
            print(f"  ✔ {csv_file.name}  ({len(df)}행, 인코딩: {enc})")
        except Exception as e:
            print(f"  ✘ {csv_file.name} 읽기 실패: {e}")

    # ④ 합치기
    combined = pd.concat(all_data, ignore_index=True)
    print(f"\n  합치기 완료: 총 {len(combined)}행")

    # ⑤ 데이터 정리
    if DROP_EMPTY_ROWS:
        before = len(combined)
        combined.dropna(how="all", inplace=True)
        combined.reset_index(drop=True, inplace=True)
        print(f"  빈 행 제거: {before - len(combined)}행 삭제")

    if REMOVE_DUPLICATES:
        before = len(combined)
        # 출처파일 열 제외하고 중복 체크
        check_cols = [c for c in combined.columns if c != "출처파일"]
        combined.drop_duplicates(subset=check_cols, inplace=True)
        combined.reset_index(drop=True, inplace=True)
        print(f"  중복 제거: {before - len(combined)}행 삭제")

    # ⑥ CSV로 저장
    combined.to_csv(OUTPUT_CSV, index=False, encoding="utf-8-sig")
    print(f"  ✔ CSV 저장 완료 → {OUTPUT_CSV}")

    # ⑦ 엑셀로 저장
    combined.to_excel(OUTPUT_XLSX, index=False)
    print(f"  ✔ 엑셀 저장 완료 → {OUTPUT_XLSX}")

    print(f"\n✅ 완료! 최종 {len(combined)}행 저장")

3단계: 실행 방법

  1. 합칠 CSV 파일들을 하나의 폴더에 모아둡니다.
  2. 코드 ① 설정의 FOLDER_PATH에 그 폴더 경로를 입력합니다.
  3. OUTPUT_CSVOUTPUT_XLSX에 저장할 파일 경로를 입력합니다.
  4. 중복 제거·빈 행 정리가 필요 없으면 REMOVE_DUPLICATESDROP_EMPTY_ROWSFalse로 변경합니다.
  5. 터미널에서 아래 명령어로 실행합니다:
python merge_csv.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  📂 발견된 CSV 파일: 4개
  ✔ 주문내역_1월.csv  (312행, 인코딩: cp949)
  ✔ 주문내역_2월.csv  (287행, 인코딩: cp949)
  ✔ 주문내역_3월.csv  (401행, 인코딩: utf-8)
  ✔ 주문내역_4월.csv  (356행, 인코딩: utf-8)

  합치기 완료: 총 1356행
  빈 행 제거: 3행 삭제
  중복 제거: 12행 삭제
  ✔ CSV 저장 완료 → C:\Users\내이름\Desktop\합쳐진_데이터.csv
  ✔ 엑셀 저장 완료 → C:\Users\내이름\Desktop\합쳐진_데이터.xlsx

✅ 완료! 최종 1341행 저장

4단계: 자주 발생하는 오류와 해결법

오류 1: 합쳐진 파일에서 한글이 깨짐

결과 CSV를 엑셀에서 열 때 한글이 깨진다면, 저장 시 encoding="utf-8-sig"가 적용되어 있는지 확인하세요. utf-8-sig는 엑셀에서 UTF-8 파일을 올바르게 열기 위한 BOM 포함 인코딩입니다. 코드에 이미 적용되어 있습니다.

오류 2: 열 구조가 달라서 합쳐진 파일에 빈 열이 많음

CSV 파일마다 열 이름이 다를 경우 pd.concat이 모든 열을 포함해 빈 값으로 채웁니다. 합칠 파일들의 헤더(1행)가 동일한지 먼저 확인하세요. 특정 열만 선택해서 합치려면 읽기 후 아래 코드를 추가하세요:

df = df[["주문번호", "상품명", "수량", "금액"]]   # ← 필요한 열만 선택

오류 3: UnicodeDecodeError

chardet이 인코딩을 잘못 감지한 경우입니다. 해당 파일을 메모장으로 열어 "다른 이름으로 저장" → 인코딩을 UTF-8로 변경 후 저장하면 해결됩니다.


응용: 특정 조건으로 필터링 후 합치고 싶다면

합치기 전에 각 CSV에서 조건에 맞는 행만 추출하고 싶다면, 읽기 후 바로 필터를 적용하면 됩니다. 예를 들어 "완료" 상태인 주문만 합치려면 아래처럼 수정하세요.

df = pd.read_csv(csv_file, encoding=enc, on_bad_lines="skip")

# 합치기 전 필터 적용 (예: 주문상태가 "완료"인 행만 추출)
df = df[df["주문상태"] == "완료"]

if ADD_SOURCE_COL:
    df["출처파일"] = csv_file.name
all_data.append(df)
💡 이전 게시글과 결합하면: 합쳐진 데이터를 엑셀 자동 정렬·필터링 편으로 추가 가공하거나, 차트 자동 저장 편으로 시각화하면 데이터 분석 파이프라인을 완성할 수 있습니다.

핵심 요약

  • 준비물: Python + pandas + openpyxl + chardet 설치 (pip install pandas openpyxl chardet)
  • 설정: FOLDER_PATH, OUTPUT_CSV, OUTPUT_XLSX 경로만 수정
  • 실행: 터미널에서 python merge_csv.py 입력
  • 결과: 인코딩 자동 감지로 한글 깨짐 방지, 중복·빈 행 자동 정리, CSV·엑셀 동시 저장

이 코드를 응용하면 합쳐진 데이터에서 특정 기간 데이터만 추출하거나, 열 이름을 통일하는 전처리 작업도 자동화할 수 있습니다.

이 블로그의 인기 게시물

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁