폴더에 쌓인 엑셀 30개, 파이썬으로 1초에 하나로 합치기 (pandas)

월말에 지점별 매출 파일이 30개씩 쌓이면, 김대리 팀은 예전엔 파일 열기 → 전체 복사 → 붙여넣기를 반복했어요. 열 이름이 살짝 다르면 그날 야근이었죠. 지금은 pandas로 폴더를 훑어 concat 한 번입니다.

오늘은 read_html 웹 표나 VBA merge 다음 단계로, 여러 엑셀을 하나로 합치는 파이썬 패턴을 정리합니다. 합친 뒤 groupby 집계로 바로 이어지면 월말 루틴이 끝납니다.

이 글을 따라 하면 얻는 것
glob + read_excel 반복
pd.concat·출처 파일 열 추가
– 시트명·헤더 불일치 대응
– 합친 뒤 엑셀 저장

1. 환경

pip install pandas openpyxl

.xls 구형 파일이 섞이면 xlrd가 필요할 수 있습니다. 사무실 표준은 xlsx로 통일하는 편이 안전해요.

2. 기본 — 폴더 스캔

from pathlib import Path
import pandas as pd

folder = Path(r"C:\보고서\2026-03")
files = sorted(folder.glob("*.xlsx"))
print(len(files), "개 파일")

~$ 임시 파일은 if not f.name.startswith("~$")로 걸러내세요.

3. 읽고 합치기

frames = []
for f in files:
    df = pd.read_excel(f, sheet_name="데이터")  # 시트명 팀 규칙 확인
    df["출처파일"] = f.name
    frames.append(df)

merged = pd.concat(frames, ignore_index=True)
merged.to_excel("통합_매출.xlsx", index=False)
print(merged.shape)

출처파일 열 — 나중에 오류 추적할 때 필수입니다.

4. 열이 다른 파일이 섞일 때

common = ["일자", "지점", "매출"]
for f in files:
    df = pd.read_excel(f)
    missing = set(common) - set(df.columns)
    if missing:
        print("SKIP", f.name, "누락 열:", missing)
        continue
    df = df[common]
    frames.append(df)

또는 pd.concat(..., join="outer")fillna — 다만 숫자 열에 NaN이 생기면 집계 전에 정리하세요.

5. 시트가 여러 개인 통합 통장

all_sheets = []
for f in files:
    xls = pd.ExcelFile(f)
    for sheet in xls.sheet_names:
        df = pd.read_excel(f, sheet_name=sheet)
        df["출처파일"] = f.name
        df["출처시트"] = sheet
        all_sheets.append(df)
merged = pd.concat(all_sheets, ignore_index=True)

6. dtype·날짜 함정

  • 일자20260301 숫자로 들어오면 pd.to_datetime(..., format="%Y%m%d")
  • 지점 코드 앞자리 0 — read_excel(..., dtype={"지점": str})

7. VBA merge와 선택

상황 추천
파일 5개 이하, 서식 유지 VBA 폴더 merge
파일 20개+, 열만 필요 pandas
매일 같은 폴더 작업 스케줄러 + .py

8. FAQ

Q. 메모리 부족
chunksize 대신 파일별로 parquet 중간 저장 후 마지막에 concat.

Q. 암호 걸린 엑셀
pandas는 직접 못 엽니다 — 팀에서 암호 해제 규칙을 먼저.

9. 연습

1) 샘플 xlsx 3개에 출처파일까지 붙여 합치기 2) 열 하나 빠진 파일 넣고 SKIP 로그 확인 3) groupby로 지점별 합계.

다음: openpyxl 차트 · smtplib 메일.

참고: pandas.concat.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

concat 전 dtypes 통일. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

출처파일 열은 감사용 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

임시 ~$ 파일 제외. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

작성자 소개