폴더 속 엑셀 파일 한 번에 합치기: pandas·pathlib 자동 취합 기초

3초 요약

폴더 속 엑셀 파일 한 번에 합치기: pandas·pathlib 자동 취합 기초 관련 확인 방법과 주의사항을 정리했습니다.

폴더에 월별·지점별 엑셀 파일이 쌓였는데 복사와 붙여넣기를 반복하고 있다면, Python의 pandas와 pathlib로 한 번에 취합할 수 있습니다. 기본 흐름은 폴더에서 파일을 찾고, 각 파일을 DataFrame으로 읽고, 행 방향으로 연결한 다음 새 엑셀 파일로 저장하는 방식입니다.

다만 곧바로 합치기 전에 시트명, 제목 행 위치, 열 이름, 코드·날짜 형식부터 확인해야 합니다. 파일마다 구조가 다르면 열이 어긋나거나 빈값이 생길 수 있고, 결과 파일을 입력 폴더 안에 두면 다음 실행 때 그 파일까지 다시 읽는 문제도 생기거든요.

이 글에서는 2026년 8월 26일 기준으로 설치부터 기본 코드, 파일 순서, 전체 시트 처리, 중복 제거, 오류 점검, 수식·매크로·서식의 한계까지 안전한 순서로 설명합니다. 단순히 실행되는 코드가 아니라 결과가 맞는지 검증하는 방법까지 함께 살펴보겠습니다.

엑셀 여러 파일 합치기 빠른 결론

여러 엑셀 파일의 열 구조가 같고 같은 위치에 헤더가 있다면, 가장 간단한 방법은 Path.glob()으로 파일 목록을 만든 뒤 pandas.read_excel()로 하나씩 읽는 것입니다. 읽은 DataFrame은 리스트에 모으고 마지막에 pandas.concat()을 한 번만 실행합니다. 반복문 안에서 누적할 때마다 concat을 실행하는 것보다 흐름이 단순하고 불필요한 반복 처리도 줄일 수 있습니다.

파일 처리 순서가 결과 행 순서에 영향을 준다면 sorted()를 반드시 적용하세요. Path.glob("*.xlsx")가 돌려주는 순서는 파일명순으로 보장되지 않습니다. 월별 파일이라면 이름을 2026-01.xlsx, 2026-02.xlsx처럼 자릿수를 맞춰 두는 편이 안전합니다. 숫자가 섞인 파일명은 일반 문자열 정렬 결과가 사람이 예상한 순서와 다를 수 있으므로 실제 목록도 출력해 봐야 합니다.

기본 실행 형태는 다음과 같습니다. input_dir은 원본 폴더이며, 결과 파일은 입력 대상에서 제외합니다. ignore_index=True는 각 파일의 기존 행 인덱스를 버리고 결과에 새 연속 인덱스를 부여합니다. index=False는 저장할 때 pandas 인덱스가 별도 열로 생기는 것을 막습니다.

from pathlib import Path
import pandas as pd

input_dir = Path(r"C:\work\excel")
output_file = input_dir / "통합결과.xlsx"

files = sorted(
    path for path in input_dir.glob("*.xlsx")
    if path != output_file and not path.name.startswith("~$")
)

if not files:
    raise FileNotFoundError("취합할 .xlsx 파일이 없습니다.")

frames = []
for path in files:
    df = pd.read_excel(path, sheet_name=0)
    df["원본파일"] = path.name
    frames.append(df)

result = pd.concat(frames, axis=0, join="outer", ignore_index=True)
result.to_excel(output_file, sheet_name="통합", index=False)

이 코드는 첫 번째 시트의 셀 데이터를 행 방향으로 모으는 기초 예시입니다. 원본 통합문서의 차트, 도형, 인쇄 설정, 셀 병합, 복잡한 서식을 그대로 합치는 기능은 아닙니다. 실행 후에는 파일 개수뿐 아니라 입력 행 수의 합계, 결과 행 수, 핵심 열의 빈값과 중복을 함께 비교해야 제대로 취합됐다고 판단할 수 있습니다.

⚠️ 결과 파일을 다시 입력으로 읽는 순환 취합을 막으세요

결과 파일을 원본과 같은 폴더에 저장한다면 파일 목록에서 명시적으로 제외해야 합니다. 제외하지 않으면 두 번째 실행부터 이전 통합 결과가 원본과 함께 들어가 행이 중복될 수 있습니다. Excel이 열어 둔 파일에 만드는 ~$ 임시 파일도 함께 제외하는 편이 안전합니다.

파일을 합치기 전에 확인할 구조와 대상

먼저 샘플 파일 두세 개를 직접 열어 구조를 비교하세요. 확인할 항목은 실제 데이터가 있는 시트명, 열 제목이 시작되는 행, 빈 상단 행, 병합 셀, 열 이름의 띄어쓰기와 데이터 시작 위치입니다. 눈으로 비슷해 보여도 한 파일에는 고객번호, 다른 파일에는 고객 번호가 있으면 pandas는 서로 다른 열로 인식합니다. 제목 위에 보고서명이 한 줄 들어간 파일이라면 header=1처럼 헤더 위치를 조정해야 합니다.

read_excel()의 기본 sheet_name=0은 첫 번째 시트만 읽습니다. 모든 파일에서 같은 이름의 시트를 취합하려면 sheet_name="매출"처럼 명시하는 편이 낫습니다. 파일마다 해당 시트가 없을 가능성이 있다면 실행 전에 pd.ExcelFile(path).sheet_names로 시트 목록을 검사하거나, 누락 파일을 오류 목록에 남겨야 합니다. 첫 번째 시트가 항상 실제 데이터 시트라는 보장은 없기 때문입니다.

사업자번호, 우편번호, 상품코드처럼 앞자리 0이 중요한 열은 숫자가 아니라 문자열로 읽어야 합니다. 예를 들어 dtype={"사업자번호": "string", "상품코드": "string"}을 지정할 수 있습니다. 날짜도 파일마다 실제 날짜값과 문자열이 섞여 있을 수 있으므로 읽은 뒤 pd.to_datetime()으로 변환하고 변환 실패 건수를 확인하는 편이 안전합니다. 자동 형식 추론에만 맡기면 파일별 결과가 달라질 수 있습니다.

또한 취합의 의미부터 구분해야 합니다. 열 구성이 같은 월별 자료를 아래로 쌓는 작업은 concat이 맞습니다. 반면 주문표와 고객표를 고객번호로 연결하거나 상품표에서 단가를 가져오는 작업은 pandas.merge()가 더 직접적입니다. 키 열에 중복값이 있으면 결합 결과가 예상보다 크게 늘어날 수 있으므로, merge 전에는 양쪽 키의 중복 여부와 일대일·일대다 관계를 먼저 확인해야 합니다.

💡 원본 출처 열을 먼저 붙이면 오류 추적이 쉬워집니다

각 DataFrame에 원본파일과 필요하면 원본시트 열을 추가해 두세요. 빈값, 중복, 형식 오류를 발견했을 때 어느 파일과 시트에서 들어온 행인지 즉시 찾을 수 있습니다. 검증이 끝난 뒤 필요하지 않으면 해당 열만 제거하면 됩니다.

concat·merge·전체 시트 취합 방식 비교

엑셀 파일을 ‘합친다’는 표현에는 서로 다른 작업이 섞여 있습니다. 행을 아래로 이어 붙이는지, 공통 열만 남길지, 특정 키를 기준으로 옆에 붙일지, 여러 시트를 각각 보존할지에 따라 함수와 결과가 달라집니다. 목적을 정하지 않고 코드를 고르면 실행은 되더라도 결과 행 수와 열 구성이 업무 의도에서 벗어날 수 있습니다.

상황 권장 방식 결과와 확인점
같은 열의 월별 파일 누적 concat(axis=0) 행 방향 연결, 중복은 자동 제거되지 않음
파일마다 열 일부가 다름 concat(join="outer") 전체 열을 보존하고 없는 값은 결측 처리
공통 열만 필요함 concat(join="inner") 한 파일에만 있는 열은 결과에서 제외
고객번호·주문번호로 연결 merge() 키 중복 시 다대다 결합으로 행 수가 증가할 수 있음
파일의 모든 시트 읽기 read_excel(sheet_name=None) 시트명과 DataFrame의 딕셔너리를 펼쳐서 처리

concat()의 기본값은 axis=0join="outer"입니다. 따라서 같은 이름의 열을 맞춰 행을 누적하고, 어느 한 파일에만 존재하는 열도 보존합니다. 그 열이 없는 파일에서 들어온 행에는 결측값이 생깁니다. 공통 열만 남기려면 join="inner"를 명시할 수 있지만, 필요한 열이 조용히 사라질 수 있으므로 적용 전 파일별 열 목록을 비교해야 합니다.

모든 시트를 자동으로 읽으려면 sheet_name=None을 사용합니다. 반환값은 하나의 DataFrame이 아니라 시트명을 키로 갖는 딕셔너리입니다. 따라서 파일과 시트를 이중으로 순회하면서 각 DataFrame에 출처 정보를 붙여 리스트에 담아야 합니다. 동일한 시트 이름이라도 열 구조가 다른 경우가 있으니 단순히 펼치는 것만으로 검증이 끝나는 것은 아닙니다.

frames = []

for path in files:
    sheets = pd.read_excel(path, sheet_name=None)
    for sheet_name, df in sheets.items():
        df["원본파일"] = path.name
        df["원본시트"] = sheet_name
        frames.append(df)

result = pd.concat(frames, ignore_index=True, join="outer")

반대로 여러 자료를 열 방향으로 붙이고 싶다는 이유만으로 concat(axis=1)을 쓰면 현재 행 인덱스를 기준으로 맞춰집니다. 두 파일의 행 순서가 조금이라도 다르면 서로 관계없는 값이 한 행에 놓일 수 있습니다. 고객번호나 주문번호처럼 관계를 확인할 수 있는 키가 있다면 merge를 사용하고, validate 옵션과 행 수 비교로 결합 관계를 검증하는 방식이 더 안전합니다.

pandas 설치와 실행 전 준비 조건

Excel 입출력을 포함해 준비하려면 공식 설치 안내에 제시된 pip install "pandas[excel]" 방식을 사용할 수 있습니다. Windows PowerShell이나 명령 프롬프트에서 Python을 실행하는 환경과 같은 환경에 설치해야 합니다. 설치는 성공했는데 편집기에서 pandas를 찾지 못한다면 편집기가 선택한 Python 인터프리터와 터미널에서 사용한 Python이 같은지부터 확인하세요.

Excel 형식에 맞는 읽기 엔진도 필요합니다. 일반적인 .xlsx.xlsm에는 openpyxl이 사용될 수 있고, 오래된 .xls나 바이너리 .xlsb는 다른 엔진이 필요할 수 있습니다. 확장자만 바꾼 파일이나 손상된 통합문서는 정상적으로 읽히지 않습니다. 최신 지원 범위와 최소 버전은 바뀔 수 있으므로 오류 메시지와 pandas 설치 문서를 함께 확인해야 합니다.

폴더 경로는 Path(r"C:\work\excel")처럼 지정하면 Windows의 역슬래시 처리 실수를 줄일 수 있습니다. 스크립트와 같은 위치의 하위 폴더라면 Path("excel")처럼 상대 경로도 가능하지만, 실행 위치가 달라지면 다른 폴더를 가리킬 수 있습니다. 첫 실행에서는 input_dir.resolve()와 검색된 파일명을 출력해 실제 대상이 맞는지 확인하는 게 좋습니다.

PC에서 로컬 Python으로 처리하는 방법과 모바일 Excel 앱에서 파일을 여는 일은 서로 다릅니다. 스마트폰이나 태블릿에서는 로컬 폴더 전체를 Python 스크립트로 순회하는 환경이 일반적이지 않으므로, 자동 취합은 보통 PC의 Python 환경에서 실행하고 모바일에서는 완성된 결과를 확인하는 흐름이 현실적입니다. 웹용 Excel의 공동 편집 기능 역시 로컬 pandas 자동 처리와는 별개의 기능입니다.

대용량 파일은 파일 개수만으로 처리 시간을 예측하기 어렵습니다. 실제 부담은 전체 행과 열 수, 문자열 크기, 수식과 서식의 복잡도, 사용 가능한 메모리에 좌우됩니다. Excel 워크시트 한 장은 최대 1,048,576행과 16,384열이라는 한도가 있으므로, 결과가 이를 넘을 가능성이 있다면 여러 시트로 나누거나 CSV·데이터베이스 같은 다른 저장 형식을 검토해야 합니다.

💬 설치보다 먼저 확장자와 실행 환경을 맞춰 보세요

Excel 읽기 오류는 코드 자체보다 파일 형식에 맞는 엔진이 없거나, 패키지를 설치한 Python과 실제 실행 중인 Python이 다른 경우에 자주 발생합니다. python -m pip 형태로 설치하고, 대상 파일의 실제 확장자와 손상 여부를 확인하면 원인을 빠르게 좁힐 수 있습니다.

열 불일치·중복·빈 파일 오류 해결하기

결과에 예상하지 못한 열이 여러 개 생겼다면 열 이름부터 정리해야 합니다. 앞뒤 공백, 줄바꿈, 전각 문자, 서로 다른 표기 때문에 같은 의미의 열이 별개로 인식될 수 있습니다. 각 파일을 읽은 직후 df.columns = df.columns.astype(str).str.strip()으로 바깥 공백을 제거할 수 있지만, 상품명품목명처럼 의미를 판단해야 하는 이름까지 자동으로 바꾸면 안 됩니다. 이름 대응표를 명시적으로 만들어 변환하는 편이 안전합니다.

빈 행이나 반복 헤더도 흔한 문제입니다. 여러 보고서가 중간에 열 제목을 다시 포함하거나 맨 아래에 합계 행을 두고 있다면 단순 concat 결과에도 그대로 들어갑니다. 필수 열이 모두 빈 행을 제거하고, 특정 열 값이 열 제목과 같은 반복 헤더 행을 찾아 제외할 수 있습니다. 다만 ‘합계’라는 단어가 정상 데이터에 포함될 가능성도 있으므로 한 조건만으로 삭제하지 말고 행 전체 형태를 확인하세요.

concat은 동일한 행을 자동으로 제거하지 않습니다. 중복 제거가 필요하면 업무 기준 열을 먼저 정한 뒤 drop_duplicates(subset=["주문번호"], keep="last")처럼 처리합니다. 주문번호 하나에 여러 품목이 들어가는 구조라면 주문번호만 기준으로 제거해서는 안 되고, 주문번호와 품목코드 같은 복합 기준이 필요할 수 있습니다. 무엇을 같은 거래로 볼지는 코드가 아니라 업무 규칙에서 결정해야 합니다.

일부 파일만 실패했을 때 전체 작업이 중단되는 것이 곤란하다면 파일별 예외를 기록할 수 있습니다. 성공한 파일과 실패한 파일을 분리하고, 실패 파일명과 오류 메시지를 별도 목록에 남기세요. 그렇다고 오류 파일을 조용히 건너뛰고 결과만 저장하면 누락을 발견하기 어렵습니다. 결과 파일에 처리 파일 수, 실패 수, 입력 행 수, 출력 행 수를 기록하거나 실행 로그를 함께 남기는 편이 좋습니다.

frames = []
errors = []

for path in files:
    try:
        df = pd.read_excel(path, sheet_name="매출")
        df.columns = df.columns.astype(str).str.strip()
        df["원본파일"] = path.name
        frames.append(df)
    except Exception as exc:
        errors.append({"파일": path.name, "오류": str(exc)})

if not frames:
    raise RuntimeError("정상적으로 읽은 파일이 없습니다.")

PermissionError가 나오면 결과 파일이 Excel에서 열려 있는지 확인하세요. 시트를 찾을 수 없다는 오류는 실제 시트명과 앞뒤 공백을 점검하고, 엔진 관련 오류는 파일 확장자와 설치 패키지를 확인합니다. 저장은 성공했지만 데이터가 비었다면 검색 패턴, 헤더 위치, 필터 조건, 읽은 행 수를 차례로 출력해 어느 단계에서 값이 사라졌는지 추적하면 됩니다.

결과 저장과 수식·서식·매크로 관리 판단

DataFrame.to_excel()은 셀 데이터를 새 워크시트에 저장하는 데 적합합니다. 같은 경로에 기본 쓰기 모드로 저장하면 기존 파일이 덮어써질 수 있으므로 원본과 결과 경로를 분리하고, 먼저 통합결과_검증용.xlsx처럼 새 이름으로 저장하는 편이 안전합니다. 정상 여부를 확인하기 전에는 기존 업무 파일 경로를 출력 대상으로 지정하지 마세요.

데이터와 오류 내역을 한 통합문서의 서로 다른 시트에 저장하려면 ExcelWriter를 사용할 수 있습니다. 시트명은 서로 다르게 지정해야 하며 Excel에서 허용하지 않는 문자나 지나치게 긴 이름은 피해야 합니다. 저장 전에 결과 폴더가 존재하는지도 확인하세요. 파일이 이미 열려 있거나 권한이 없는 위치라면 저장 단계에서 실패할 수 있습니다.

with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
    result.to_excel(writer, sheet_name="통합", index=False)
    if errors:
        pd.DataFrame(errors).to_excel(
            writer, sheet_name="오류목록", index=False
        )

수식 처리는 특히 주의해야 합니다. openpyxl은 Excel 수식을 직접 계산하는 엔진이 아닙니다. data_only=True는 Excel이 마지막으로 저장했을 때 캐시한 계산값을 읽는 옵션이므로, 원본이 최근 재계산·저장되지 않았다면 값이 오래됐거나 비어 있을 수 있습니다. Python에서 저장했다고 해서 모든 수식이 자동으로 최신 값으로 다시 계산된다고 보면 안 됩니다.

매크로가 있는 .xlsm 파일은 단순히 읽고 새 .xlsx로 저장하면 원본 기능을 그대로 유지한다고 보장할 수 없습니다. VBA 요소 보존에는 openpyxl의 keep_vba 같은 별도 조건이 관련되지만, 보존이 곧 매크로 편집이나 완전한 호환을 의미하지는 않습니다. 기존 파일을 다시 저장하는 과정에서 도형 등 일부 개체가 유실될 가능성도 공식 문서에서 안내하므로 원본 사본을 따로 보관해야 합니다.

셀 색상, 조건부 서식, 차트, 도형, 인쇄 영역까지 원본과 동일하게 합쳐야 한다면 pandas의 셀 데이터 중심 방식만으로는 요구를 충족하기 어렵습니다. 이때는 무엇을 보존해야 하는지 항목별로 정한 뒤 Excel 자동화나 전용 통합문서 처리 방식을 별도로 검토해야 합니다. 데이터 행 취합과 문서 모양 보존은 다른 문제라는 점을 먼저 구분하는 것이 핵심입니다.

💬 원본 보존 요구가 높을수록 새 파일 저장이 안전합니다

공식 동작 범위를 기준으로 보면 pandas는 표 형태의 값을 읽고 정리해 새 결과를 만드는 작업에 잘 맞습니다. 반면 매크로, 도형, 복잡한 서식을 유지해야 하는 통합문서를 원본 경로에 다시 저장하는 일은 손실 위험을 먼저 검증해야 합니다. 복사본에서 시험하고 원본과 결과를 나란히 비교하세요.

실행 전후 검증과 최종 선택 흐름

첫 단계에서는 전체 폴더를 곧바로 처리하지 말고 구조가 다른 파일을 포함해 두세 개만 복사한 시험 폴더를 만드세요. 파일 목록과 처리 순서를 출력하고, 각 파일의 시트명·열 이름·행 수를 확인합니다. 이때 헤더 위치, 필수 열, 문자열로 보존할 코드 열, 날짜 변환 기준을 확정하면 전체 실행에서 생길 오류를 크게 줄일 수 있습니다.

두 번째 단계에서는 취합 목적에 맞는 방식을 고릅니다. 같은 표를 아래로 누적하면 concat, 키를 기준으로 옆에 연결하면 merge, 모든 시트를 가져오려면 sheet_name=None과 시트별 반복 처리가 필요합니다. 열이 다를 때 전체 열을 보존할지 공통 열만 남길지도 결정하세요. 선택 기준을 문서로 남기면 다음 달 파일이 추가됐을 때도 같은 규칙을 적용할 수 있습니다.

세 번째 단계에서는 원본 추적 열과 검증 수치를 함께 만듭니다. 입력 파일별 읽은 행 수의 합, 빈 행 제거 수, 중복 제거 수, 최종 행 수가 서로 어떻게 이어지는지 확인하세요. 중복을 제거했다면 사용한 기준 열과 keep 규칙도 기록해야 합니다. 결과 행 수가 단순 입력 합계와 다르더라도 이유가 설명된다면 정상일 수 있지만, 설명되지 않는 차이는 저장 전에 조사해야 합니다.

네 번째 단계에서는 결과를 새 경로에 저장한 뒤 Excel에서 직접 열어 봅니다. 주요 코드값의 앞자리 0, 날짜 표시, 한글 열 이름, 빈값, 첫 행과 마지막 행, 파일 경계 부근의 데이터를 표본 확인하세요. 파일이 열린다는 사실만으로 취합이 정확하다는 뜻은 아닙니다. 특히 merge를 사용했다면 키 중복으로 행이 증식하지 않았는지 결합 전후 행 수를 비교해야 합니다.

마지막으로 자동화 범위를 판단합니다. 구조가 일정한 반복 자료라면 폴더 경로와 출력 이름만 바꿔 재사용할 수 있습니다. 반대로 시트명과 헤더 위치가 자주 달라지거나 매크로·도형·복잡한 서식 보존이 필수라면 무조건 자동 실행하지 말고 사전 검사와 예외 목록을 강화해야 합니다. 모바일에서는 결과 확인에 집중하고, 실제 폴더 순회와 취합은 검증 가능한 PC 환경에서 수행하는 편이 적절합니다.

💡 처음에는 덮어쓰기보다 검증 가능한 새 이름을 선택하세요

입력 폴더의 파일 수, 처리 성공 수, 실패 수, 입력 행 합계, 최종 행 수를 확인한 뒤 새 결과 파일을 열어 보세요. 검증이 끝난 다음에만 정식 파일명으로 이동하는 흐름이 안전합니다. 자동화를 예약 실행한다면 날짜나 실행 시각을 결과 이름에 포함해 이전 결과를 보존하는 방법도 고려할 수 있습니다.

자주 묻는 질문 및 정리

Q. 모든 엑셀 파일의 첫 번째 시트를 자동으로 합칠 수 있나요?

A. 네, 각 파일에 pd.read_excel(path, sheet_name=0)을 적용해 읽은 뒤 리스트에 모아 concat하면 됩니다. 다만 첫 번째 시트가 실제 데이터 시트인지 파일별로 먼저 확인해야 합니다.

Q. 파일에 있는 모든 시트를 한꺼번에 읽으려면 어떻게 하나요?

A. sheet_name=None을 지정하면 시트명과 DataFrame으로 구성된 딕셔너리가 반환됩니다. 파일별·시트별로 반복하면서 리스트에 담고, 원본 파일명과 시트명을 출처 열로 추가한 뒤 concat해야 합니다.

Q. 파일마다 열이 조금씩 달라도 합쳐지나요?

A. 기본 join="outer"에서는 전체 열의 합집합을 보존하며 해당 열이 없는 행에는 결측값이 들어갑니다. 공통 열만 남기려면 join="inner"를 사용할 수 있지만 필요한 열이 제외되지 않는지 먼저 확인하세요.

Q. 파일명 순서대로 합쳐지지 않는 이유는 무엇인가요?

A. Path.glob()의 반환 순서는 보장되지 않기 때문입니다. 파일명순 처리가 필요하면 sorted(input_dir.glob("*.xlsx"))처럼 정렬하고, 숫자 자릿수가 다른 파일명은 실제 정렬 결과도 확인해야 합니다.

Q. 같은 행은 concat이 자동으로 제거하나요?

A. 아니요, concat은 동일 행을 자동 제거하지 않습니다. 업무상 같은 데이터로 판단할 기준 열을 확정한 뒤 drop_duplicates()를 별도로 적용해야 하며, 주문번호 하나만으로 제거해도 되는지는 자료 구조에 따라 다릅니다.

Q. 고객번호를 기준으로 두 파일을 옆으로 붙일 때도 concat을 쓰나요?

A. 고객번호 같은 키 기준 결합에는 pandas.merge()가 더 적합합니다. 양쪽 자료의 키가 중복되면 다대다 결합으로 결과 행이 증가할 수 있으므로 결합 전후 행 수와 키 중복을 검사하세요.

Q. 사업자번호나 상품코드의 앞자리 0은 어떻게 지키나요?

A. 해당 열을 문자열로 읽어야 합니다. dtype={"사업자번호": "string"}처럼 지정할 수 있지만 파일의 실제 열 이름과 값 형태를 확인한 뒤 적용해야 하며, 이미 숫자로 저장된 원본에서 사라진 0은 자동 복원되지 않습니다.

Q. 수식 결과도 Python이 최신 값으로 다시 계산해 주나요?

A. 아니요, openpyxl 자체는 Excel 수식을 계산하지 않습니다. data_only=True는 Excel이 마지막으로 저장한 계산값을 읽을 뿐이므로 원본이 최근 재계산되어 저장됐는지 확인해야 합니다.

Q. 매크로와 도형, 서식도 원본 그대로 보존되나요?

A. 완전한 보존을 보장할 수 없습니다. VBA 보존에는 별도 옵션이 관련되며 기존 파일을 다시 저장할 때 도형 등 일부 개체가 유실될 수 있습니다. 원본 사본에서 시험하고 데이터 취합과 문서 서식 보존을 별도 요구사항으로 다뤄야 합니다.

Q. 결과 파일이 다음 실행에서 다시 합쳐지는 문제는 어떻게 막나요?

A. 결과 파일을 다른 폴더에 저장하거나 파일 목록에서 출력 경로를 명시적으로 제외하세요. Excel 임시 파일인 ~$로 시작하는 파일도 제외하고, 실행 전에 최종 입력 목록을 출력하면 순환 취합을 예방할 수 있습니다.

이 글은 여러 Excel 파일을 pandas와 pathlib로 취합하기 위한 정보 제공을 목적으로 합니다. 실제로 필요한 시트명, 헤더 위치, 열 형식, 중복 기준, 저장 방식은 파일 구조와 업무 규칙에 따라 달라질 수 있습니다. 원본을 보관한 상태에서 일부 파일로 먼저 검증하고, 패키지 지원 범위와 세부 옵션은 pandas·Python·openpyxl 등 공식 문서의 최신 내용을 확인하세요.

참고자료

  • pandas.read_excel 공식 문서
  • pandas.concat 공식 문서
  • pandas Merge, join, concatenate and compare 사용자 안내
  • pandas.DataFrame.to_excel 공식 문서
  • pandas Installation 공식 문서
  • Python pathlib 공식 문서 및 Path.glob 안내
  • pandas.merge 공식 문서
  • openpyxl Tutorial
  • Microsoft Excel specifications and limits

댓글 남기기