폴더에 쌓인 엑셀 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에 기준을 한 줄로 박아 두세요.