[실무 강의] 10분 만에 끝내는: 흩어진 엑셀 파일 합치고 핵심 데이터 자동 추출하기 완벽 마스터 튜토리얼

학습 목표

오늘 여러분은 흩어져 있는 수많은 엑셀 파일들을 단 10분 만에 하나로 통합하고, 그 안에서 원하는 핵심 데이터를 자동으로 추출하여 새로운 엑셀 파일로 저장하는 방법을 완벽하게 마스터하게 될 것입니다. 이 실무 기술은 보고서 작성 시간을 획기적으로 단축하고, 데이터 분석의 기초를 다지는 데 필수적인 역량이 될 것입니다. 더 이상 수동으로 파일을 열고 복사-붙여넣기 하는 비효율적인 작업에 시간을 낭비하지 마십시오.

사전 준비 사항

본격적인 실습에 앞서, 원활한 진행을 위한 개발 환경을 설정해야 합니다. 아래 안내에 따라 필요한 도구들을 준비해 주시기 바랍니다.

1. 개발 환경

  • 운영체제 (OS): Windows 10/11, macOS, 또는 Linux (실습은 모든 OS에서 동일하게 동작합니다.)
  • 코드 에디터: Visual Studio Code (VS Code) 최신 버전 (강력 권장)
  • Python 버전: 3.8 이상 (Python 3.10 또는 그 이후 버전을 권장합니다. 안정성과 성능이 향상되었습니다.)

2. 필수 라이브러리 설치

파이썬을 사용하여 엑셀 파일을 다루기 위해서는 pandas 라이브러리와 엑셀 파일 입출력을 위한 openpyxl 라이브러리가 필요합니다. VS Code 터미널 또는 명령 프롬프트(CMD)/터미널을 열고 다음 명령어를 입력하여 설치해 주세요.

pip install pandas openpyxl

설치가 완료되었다면, 이제 실습을 위한 모든 준비가 끝났습니다.

단계별 실습 과정

이제부터 실제 데이터를 다루는 것처럼 단계별로 따라 하면서 흩어진 엑셀 파일을 합치고 핵심 데이터를 추출하는 과정을 직접 경험해 보겠습니다. 여러분의 작업 효율을 극대화할 수 있는 강력한 파이썬 스크립트를 함께 만들어 나갈 것입니다.

1. 실습 파일 준비하기

실습을 위해 가상의 엑셀 파일들을 준비해야 합니다. 여러분의 컴퓨터 아무 위치에 excel_data라는 폴더를 생성하고, 그 안에 다음과 같은 형태의 엑셀 파일 여러 개(예: sales_q1_2026.xlsx, sales_q2_2026.xlsx 등)를 생성해 주세요. 각 파일은 동일한 컬럼 구조를 가지고 있어야 합니다. 예를 들어, 각 엑셀 파일에 다음과 같은 데이터가 포함되어 있다고 가정합니다.


날짜 제품명 판매량 매출액 담당자
2026-01-15 노트북 Pro 10 15000000 김철수
2026-02-20 마우스 X100 50 2500000 박영희

이 폴더 경로를 기억해 두세요. 잠시 후 파이썬 스크립트에서 이 경로를 사용하게 될 것입니다.

2. Python 스크립트 작성하기

VS Code를 열고 새로운 파이썬 파일(예: excel_processor.py)을 생성한 후, 아래 코드들을 순서대로 작성해 나가겠습니다.

2.1. 라이브러리 임포트 및 파일 경로 설정

가장 먼저 필요한 라이브러리들을 임포트하고, 엑셀 파일들이 저장된 폴더의 경로를 지정합니다. os 라이브러리는 파일 시스템 경로를 다루는 데 유용합니다.

import pandas as pd
import os

# 엑셀 파일들이 저장된 폴더 경로
# 여러분의 실제 경로로 수정해주세요!
EXCEL_FOLDER_PATH = './excel_data' # 현재 스크립트와 같은 위치에 excel_data 폴더가 있다면 이대로 사용

# 결과를 저장할 파일명
OUTPUT_FILE_NAME = 'combined_and_extracted_sales_2026.xlsx'

print(f"엑셀 파일 경로: {EXCEL_FOLDER_PATH}")
print(f"출력 파일명: {OUTPUT_FILE_NAME}")

EXCEL_FOLDER_PATH 변수에는 여러분이 엑셀 파일을 저장해 둔 실제 경로를 입력해야 합니다. 만약 스크립트 파일과 excel_data 폴더가 같은 위치에 있다면 위 코드처럼 './excel_data'로 설정해도 무방합니다.

2.2. 흩어진 엑셀 파일 모두 읽어오기

이제 지정된 폴더 안의 모든 엑셀 파일들을 찾아서 각각 읽어온 후, 하나의 데이터프레임으로 합치는 작업을 수행합니다. pd.concat() 함수는 여러 데이터프레임을 효율적으로 결합하는 데 사용됩니다.

# 모든 엑셀 파일을 담을 빈 리스트 생성
all_dataframes = []

# 지정된 폴더 내의 모든 파일 목록 가져오기
for filename in os.listdir(EXCEL_FOLDER_PATH):
    # 엑셀 파일(.xlsx)만 필터링
    if filename.endswith('.xlsx'):
        file_path = os.path.join(EXCEL_FOLDER_PATH, filename)
        try:
            # 엑셀 파일을 데이터프레임으로 읽어오기
            df = pd.read_excel(file_path)
            all_dataframes.append(df)
            print(f"'{filename}' 파일 읽기 성공.")
        except Exception as e:
            print(f"'{filename}' 파일 읽기 실패: {e}")

# 모든 데이터프레임을 하나로 합치기
if all_dataframes:
    combined_df = pd.concat(all_dataframes, ignore_index=True)
    print(f"총 {len(all_dataframes)}개의 엑셀 파일이 성공적으로 합쳐졌습니다.")
    print("결합된 데이터프레임의 상위 5행:")
    print(combined_df.head())
else:
    print("엑셀 파일을 찾을 수 없거나 읽을 수 있는 파일이 없습니다.")
    exit() # 파일이 없으면 스크립트 종료

이 코드는 excel_data 폴더 내의 모든 .xlsx 파일을 찾아 읽고, 그 내용을 all_dataframes 리스트에 추가합니다. 마지막으로 pd.concat을 이용해 모든 데이터프레임을 combined_df 하나로 합칩니다. ignore_index=True는 각 파일의 인덱스가 아닌 새로운 연속적인 인덱스를 생성하도록 합니다.

2.3. 핵심 데이터 추출 및 필터링

합쳐진 데이터프레임에서 여러분이 원하는 핵심 데이터를 추출하고 필터링하는 단계입니다. 여기서는 ‘매출액’이 1000만원 이상인 데이터만 추출하고, ‘날짜’, ‘제품명’, ‘매출액’, ‘담당자’ 컬럼만 선택하는 예시를 보여드리겠습니다. 여러분의 필요에 따라 조건을 자유롭게 변경할 수 있습니다.

# '매출액'이 10,000,000원 이상인 데이터만 필터링
filtered_df = combined_df[combined_df['매출액'] >= 10000000]

# 필요한 컬럼만 선택
extracted_df = filtered_df[['날짜', '제품명', '매출액', '담당자']]

print("\n--- 핵심 데이터 추출 및 필터링 완료 ---")
print(f"총 {len(extracted_df)}개의 조건에 맞는 데이터가 추출되었습니다.")
print("추출된 데이터프레임의 상위 5행:")
print(extracted_df.head())

combined_df['매출액'] >= 10000000 부분은 불리언 인덱싱(Boolean Indexing)을 사용하여 조건을 만족하는 행들만 선택합니다. 이어서 이중 대괄호 [['날짜', '제품명', ...]]를 사용하여 특정 컬럼들만 선택함으로써 필요한 데이터만 깔끔하게 정리할 수 있습니다.

2.4. 추출된 데이터 새로운 엑셀 파일로 저장

이제 최종적으로 추출된 extracted_df를 새로운 엑셀 파일로 저장합니다. index=False 옵션은 데이터프레임의 인덱스가 엑셀 파일에 저장되지 않도록 합니다. encoding='utf-8-sig'는 한글 깨짐 방지를 위해 종종 사용되지만, to_excel은 기본적으로 유니코드를 잘 처리하므로 필수는 아닙니다.

# 추출된 데이터를 새로운 엑셀 파일로 저장
try:
    extracted_df.to_excel(OUTPUT_FILE_NAME, index=False)
    print(f"\n성공적으로 '{OUTPUT_FILE_NAME}' 파일로 저장되었습니다.")
except Exception as e:
    print(f"파일 저장 중 오류 발생: {e}")

이로써 흩어진 엑셀 파일들을 합치고 핵심 데이터를 추출하여 새로운 파일로 저장하는 모든 과정이 완료되었습니다! 스크립트를 실행하면 현재 파이썬 스크립트가 있는 폴더에 combined_and_extracted_sales_2026.xlsx 파일이 생성될 것입니다.

결과 확인

이제 여러분이 작성하고 실행한 스크립트의 결과물을 확인해 볼 시간입니다. 스크립트가 성공적으로 실행되었다면, 스크립트가 위치한 폴더에 combined_and_extracted_sales_2026.xlsx라는 이름의 새로운 엑셀 파일이 생성되었을 것입니다.

이 파일을 열어보십시오. 여러분이 지정한 조건(예: 매출액 1000만원 이상)에 맞는 데이터만 추출되어 있으며, ‘날짜’, ‘제품명’, ‘매출액’, ‘담당자’ 컬럼만으로 구성된 깔끔한 데이터를 확인할 수 있을 것입니다. 여러 개의 엑셀 파일에 흩어져 있던 정보가 하나의 파일로 통합되고, 그 안에서 필요한 정보만 선별되어 정리된 것을 보며, 이 자동화 기술의 강력함을 실감하게 될 것입니다.

이처럼 파이썬과 pandas 라이브러리를 활용하면 복잡하고 반복적인 엑셀 작업들을 단 몇 줄의 코드로 자동화하여 여러분의 귀중한 시간을 절약할 수 있습니다. 오늘 배운 내용을 바탕으로 여러분의 업무 환경에 맞는 다양한 데이터 처리 자동화를 시도해 보시기 바랍니다.

이 기술은 데이터 분석가, 사무직 종사자, 개발자 등 데이터를 다루는 모든 직군에게 필수적인 역량이 될 것입니다. 앞으로도 이러한 실무 기술들을 통해 여러분의 생산성을 한 단계 더 끌어올릴 수 있도록 돕겠습니다.

댓글 남기기


Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/media.cls.php on line 1158

Warning: getimagesize(https://static.cdn.kmong.com/gigs/0L8go1750212960.jpg): Failed to open stream: no suitable wrapper could be found in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/media.cls.php on line 1158

Warning: getimagesize(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/media.cls.php on line 1158

Warning: getimagesize(http://cdn.ppomppu.co.kr/zboard/data3/2018/0922/20180922020714_dalqzema.png): Failed to open stream: no suitable wrapper could be found in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/media.cls.php on line 1158

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/media.cls.php on line 1158

Warning: getimagesize(https://img1.daumcdn.net/thumb/R1280x0.fpng/?fname=http://t1.daumcdn.net/brunch/service/user/8k8K/image/tGpPgvgEQTyxbgTL7BvomDNwDEw.png): Failed to open stream: no suitable wrapper could be found in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/media.cls.php on line 1158

Warning: file_put_contents(): Only 4096 of 4219 bytes written, possibly out of free disk space in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/file.cls.php on line 177

Fatal error: Uncaught ErrorException: md5_file(/hosting/apdldk/html/wp-content/litespeed/js/1dc3faea8b472d7420a136c89f4d3ec9.js.tmp): Failed to open stream: No such file or directory in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/optimizer.cls.php:148 Stack trace: #0 [internal function]: litespeed_exception_handler() #1 /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/optimizer.cls.php(148): md5_file() #2 /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/optimize.cls.php(845): LiteSpeed\Optimizer->serve() #3 /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/optimize.cls.php(392): LiteSpeed\Optimize->_build_hash_url() #4 /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/optimize.cls.php(265): LiteSpeed\Optimize->_optimize() #5 /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/optimize.cls.php(226): LiteSpeed\Optimize->_finalize() #6 /hosting/apdldk/html/wp-includes/class-wp-hook.php(341): LiteSpeed\Optimize->finalize() #7 /hosting/apdldk/html/wp-includes/plugin.php(205): WP_Hook->apply_filters() #8 /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/core.cls.php(464): apply_filters() #9 [internal function]: LiteSpeed\Core->send_headers_force() #10 /hosting/apdldk/html/wp-includes/functions.php(5481): ob_end_flush() #11 /hosting/apdldk/html/wp-includes/class-wp-hook.php(341): wp_ob_end_flush_all() #12 /hosting/apdldk/html/wp-includes/class-wp-hook.php(365): WP_Hook->apply_filters() #13 /hosting/apdldk/html/wp-includes/plugin.php(522): WP_Hook->do_action() #14 /hosting/apdldk/html/wp-includes/load.php(1308): do_action() #15 [internal function]: shutdown_action_hook() #16 {main} thrown in /hosting/apdldk/html/wp-content/plugins/litespeed-cache/src/optimizer.cls.php on line 148