자동화 스케줄러가 매일 아침 지정된 시간에 알아서 파이썬 코드를 실행해 데이터를 가져오기 시작하면, 처음 며칠은 뿌듯한 마음으로 생성된 엑셀 파일들을 바라보게 됩니다. 하지만 일주일, 이주일이 지나면서 폴더 안에 data_20260709.xlsx, data_20260710.xlsx 같은 파일이 수십 개씩 쌓이기 시작하면 서서히 머리가 아파옵니다.

나중에 한 달 치 데이터를 모아서 지역별 기온 추이나 아파트 거래량 트렌드를 분석하려고 할 때, 이 수십 개의 파일을 일일이 마우스로 열어서 복사하고 하나의 파일에 붙여넣는 노가다를 해야 한다면 진정한 자동화라고 할 수 없습니다. 수집할 때부터 기존 파일 뒤에 새 데이터를 끊김 없이 자연스럽게 이어 붙이는 '데이터 누적 알고리즘'이 필요한 이유가 바로 여기 있습니다.

오늘 다룰 기술은 매일 들어오는 API 데이터를 공중 분해하지 않고, 하나의 '마스터(Master) 엑셀 파일'을 기준점 삼아 아래로 차곡차곡 에러 없이 이어 붙이는 연쇄 누적 시스템입니다.

데이터 누적의 핵심 로직: 파일이 있을 때와 없을 때의 예외 처리

파이썬 판다스(Pandas)로 데이터를 누적할 때 초보 개발자들이 가장 흔하게 저지르는 실수는 기존 파일을 그냥 덮어씌워 버리거나, 파일이 존재하지 않는 첫날부터 기존 파일을 읽으려고 시도하다가 프로그램이 뻗어버리는 현상입니다.

안정적인 자동화 엔진을 만들기 위해서는 코드가 실행되는 시점에 두 가지 상황을 스스로 판단하도록 예외 처리 구조를 설계해야 합니다.

  1. 마스터 파일이 존재하지 않는 경우 (수집 첫날): 비교하거나 불러올 기존 데이터가 없으므로, 오늘 API로 수집한 따끈따끈한 데이터프레임(DataFrame)을 마스터 파일 이름 그대로 첫 저장합니다.

  2. 마스터 파일이 이미 존재하는 경우 (수집 둘째 날 이후): 이미 기존 데이터가 누적되어 있는 상태입니다. 먼저 기존 마스터 엑셀 파일을 판다스로 읽어와서 메모리에 올립니다. 그다음 오늘 새로 수집한 데이터프레임을 기존 데이터프레임의 '맨 아래 행'에 이어 붙입니다(pd.concat). 마지막으로 합쳐진 거대한 데이터프레임을 기존 마스터 파일 이름에 그대로 덮어씌워 저장합니다.

매일 들어오는 데이터를 하나의 마스터 파일로 합치는 실전 코드

아래 스크립트는 파일 존재 여부를 체크하는 os.path.exists 함수를 활용하여, 매일 실행될 때마다 기존 파일 뒤에 데이터를 안전하게 결합하는 마스터 누적 알고리즘입니다.

Python
import os
import pandas as pd
from datetime import datetime

# 1. 경로 설정 (12편에서 배운 절대 경로 방식을 적용합니다)
base_dir = os.path.dirname(os.path.abspath(__file__))
master_file_path = os.path.join(base_dir, "master_accumulated_data.xlsx")

# 2. [예시 데이터] 오늘 날짜를 기준으로 API에서 새로 수집한 가상의 데이터라고 가정합니다.
# 실제 환경에서는 requests로 받아온 데이터를 프레임으로 만든 결과물입니다.
today_str = datetime.now().strftime("%Y-%m-%d")
new_data = [
    {"수집날짜": today_str, "지역": "서울", "대기질지수": 35, "상태": "좋음"},
    {"수집날짜": today_str, "지역": "부산", "대기질지수": 42, "상태": "좋음"}
]
df_new = pd.DataFrame(new_data)

print("--- [신규 수집] 오늘 들어온 데이터 ---")
print(df_new)

# 3. 마스터 파일 존재 여부에 따른 누적 알고리즘 가동
if not os.path.exists(master_file_path):
    # 만약 기존에 누적된 마스터 파일이 없다면 (최초 실행일)
    print("\n[알림] 마스터 파일이 존재하지 않아 새로 생성합니다.")
    df_new.to_excel(master_file_path, index=False)
    print(f"👉 최초 데이터가 '{master_file_path}'로 저장되었습니다.")
else:
    # 기존에 누적된 마aster 파일이 이미 있다면 (둘째 날 이후)
    print("\n[알림] 기존 마스터 파일을 발견했습니다. 데이터 병합을 시작합니다.")
    
    # 기존 파일 읽어오기
    df_old = pd.read_excel(master_file_path)
    
    # axis=0 설정을 통해 기존 데이터프레임 밑에 새 데이터프레임을 세로로 이어 붙입니다.
    # ignore_index=True는 뒤죽박죽 꼬일 수 있는 행 번호(인덱스)를 0부터 다시 정렬해 줍니다.
    df_combined = pd.concat([df_old, df_new], axis=0, ignore_index=True)
    
    # 4. [고급] 중복 수집 방지 안전장치
    # 동일한 날짜에 코드가 두 번 돌아가서 데이터가 쌍둥이로 쌓이는 것을 막기 위해 
    # 날짜와 지역이 완벽히 겹치면 나중에 들어온 데이터를 날려버립니다.
    df_combined.drop_duplicates(subset=['수집날짜', '지역'], keep='first', inplace=True)
    
    # 결합 및 중복 제거가 완료된 데이터를 마스터 파일에 최종 덮어쓰기
    df_combined.to_excel(master_file_path, index=False)
    print(f"👉 누적 완료! 현재 총 데이터 행 개수: {len(df_combined)}개")

누적 시스템을 가동할 때 반드시 심어두어야 할 '중복 방지 안전장치'

이 누적 시스템을 무작정 돌리다 보면 며칠 뒤 또 다른 버그를 마주하게 됩니다. 컴퓨터 스케줄러가 똑똑하게 하루에 한 번만 실행되면 좋겠지만, 중간에 컴퓨터가 꺼졌다 켜지면서 오작동을 하거나, 내가 코드를 수정하고 잘 돌아가는지 수동으로 두세 번 테스트 삼아 클릭해 보는 과정에서 '동일한 날짜의 동일한 데이터'가 마스터 파일에 더블로 누적되는 현상입니다.

이 현상이 누적되면 1년 치 데이터를 모았을 때 특정 날짜만 데이터가 3개씩 들어가서 통계 평균값이 완전히 오염됩니다.

이를 막기 위해 위 실전 코드에 구현된 drop_duplicates 문법이 반드시 들어가야 합니다. subset=['수집날짜', '지역'] 처럼 데이터의 고유한 기준점이 되는 칼럼을 묶어서 지정해 주면, 코드가 하루에 실수로 10번 실행되더라도 마스터 파일 안에는 오직 단 하나의 고유한 행만 살아남게 됩니다. 이 사소한 안전장치 한 줄이 데이터 수집 자동화 프로그램의 완성도와 데이터 무결성을 결정짓는 핵심 노하우입니다.

핵심 요약

  • 매일 수집되는 파이썬 API 데이터를 파일별로 쪼개서 저장하면 추후 통계 분석 시 극심한 수작업(노가다)이 동반되므로 하나의 마스터 파일로 관리해야 합니다.

  • os.path.exists()를 활용해 마스터 파일의 유무를 판별하고, 파일이 존재할 경우 pd.concat() 함수를 통해 기존 데이터 하단에 세로 방향으로 새 데이터를 이어 붙입니다.

  • 자동화 프로그램의 중복 실행으로 인한 데이터 오염을 방지하기 위해, 결합 후 반드시 drop_duplicates()를 호출하여 고유 기준값 기반의 행 무결성을 유지해야 합니다.