엑셀 작업하다가 파일 저장을 까먹어서 데이터 날린 경험 있으신가요. 저도 몇 시간 작업한 파일이 날아가서 정말 막막했던 적이 있어요. 그래서 파이썬으로 엑셀 파일을 자동 저장하는 방법을 찾아봤어요.
openpyxl에는 자동 저장 기능이 없어요
openpyxl 라이브러리를 써서 엑셀 파일을 다루다 보면 아쉬운 점이 하나 있어요. 자체적인 자동 저장 기능이 없다는 거예요. 그래서 우리가 직접 save() 메서드를 반복해서 호출해줘야 해요.
기본적인 방법은 이렇게 간단해요:
import openpyxl
import time
wb = openpyxl.Workbook()
ws = wb.active
while True:
# 데이터 추가 작업
ws.append(['현재 시각', time.strftime('%Y-%m-%d %H:%M:%S')])
# 파일 저장
wb.save('autosave.xlsx')
# 60초마다 저장
time.sleep(60)
이 코드는 1분마다 파일을 저장해요. time.sleep()의 숫자를 바꾸면 저장 주기를 조절할 수 있어요. 10으로 바꾸면 10초마다, 300으로 바꾸면 5분마다 저장되겠죠.
schedule 라이브러리로 더 똑똑하게 만들어요
단순히 시간 간격으로만 저장하는 게 아니라 좀 더 세밀하게 조절하고 싶다면 schedule 라이브러리를 쓰면 돼요. 먼저 설치부터 해볼게요:
pip install schedule
설치가 끝났으면 이렇게 사용할 수 있어요:
import schedule
import time
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
def save_excel():
print("엑셀 파일 저장 중...")
wb.save('my_data.xlsx')
# 5분마다 자동 저장
schedule.every(5).minutes.do(save_excel)
while True:
schedule.run_pending()
time.sleep(1)
schedule 라이브러리의 장점은 다양한 주기 설정이 가능하다는 거예요:
# 10초마다 저장
schedule.every(10).seconds.do(save_excel)
# 2시간마다 저장
schedule.every(2).hours.do(save_excel)
# 매일 오후 3시 30분에 저장
schedule.every().day.at("15:30").do(save_excel)
# 매주 금요일 오전 9시에 저장
schedule.every().friday.at("09:00").do(save_excel)
실시간 데이터 저장할 때는 flush()를 써요
센서 데이터나 로그 파일처럼 실시간으로 계속 쌓이는 데이터를 저장할 때는 텍스트 파일에 기록하는 방법도 있어요. 이때는 flush()를 써서 메모리 버퍼를 바로 비워주는 게 중요해요:
import time
with open("realtime_log.txt", "w") as f:
for i in range(100):
text = f"데이터 {i}: {time.strftime('%Y-%m-%d %H:%M:%S')}\n"
f.write(text)
f.flush() # 바로 디스크에 쓰기
time.sleep(0.1)
flush()를 안 쓰면 데이터가 메모리에만 있다가 나중에 한꺼번에 저장돼요. 프로그램이 갑자기 종료되면 메모리에 있던 데이터가 날아갈 수 있어요.
날짜별로 백업 파일 만들기
매번 같은 파일에 덮어쓰기만 하면 실수로 잘못 저장했을 때 되돌릴 수가 없어요. 날짜나 시간을 파일명에 넣어서 백업 파일을 만들어두면 안전해요:
import openpyxl
import time
from datetime import datetime
wb = openpyxl.Workbook()
ws = wb.active
def save_with_backup():
# 현재 파일 저장
wb.save('current_data.xlsx')
# 백업 파일도 생성
backup_name = f"backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
wb.save(backup_name)
print(f"백업 파일 생성: {backup_name}")
# 10분마다 백업과 함께 저장
schedule.every(10).minutes.do(save_with_backup)
while True:
# 데이터 작업
ws.append(['데이터', datetime.now()])
schedule.run_pending()
time.sleep(1)
이렇게 하면 backup_20241218_143025.xlsx 같은 형식으로 백업 파일이 만들어져요. 나중에 특정 시점의 데이터가 필요하면 해당 백업 파일을 열면 돼요.
여러 프로세스에서 동시에 저장할 때
여러 프로그램이 동시에 같은 파일을 수정하려고 하면 충돌이 날 수 있어요. 이럴 때는 multiprocessing.Queue를 써서 하나의 프로세스만 파일을 저장하도록 만들 수 있어요:
import multiprocessing
import datetime
import os
def file_save_process(q_packet, file_dir):
while True:
data = q_packet.get() # 큐에서 데이터 받기
current_date = datetime.datetime.now().strftime("%Y-%m-%d")
file_path = f"{file_dir}/{current_date}.xlsx"
# 파일에 데이터 추가하고 저장
# (실제 엑셀 저장 코드는 여기에)
print(f"데이터 저장됨: {data}")
프로그램 종료 시 자동 저장하기
작업 중에 프로그램을 종료할 때도 자동으로 저장되게 만들 수 있어요. atexit 모듈을 쓰면 프로그램이 끝날 때 실행할 함수를 등록할 수 있어요:
import openpyxl
import atexit
wb = openpyxl.Workbook()
ws = wb.active
def save_on_exit():
print("프로그램 종료 중... 파일 저장합니다.")
wb.save('final_data.xlsx')
# 프로그램 종료 시 자동 저장 등록
atexit.register(save_on_exit)
# 작업 코드
ws.append(['데이터1', '값1'])
ws.append(['데이터2', '값2'])
엑셀 자체 자동 저장 기능도 있어요
파이썬을 안 쓰고 엑셀 프로그램 자체의 자동 저장 기능을 쓸 수도 있어요. 파일 메뉴에서 옵션으로 들어가서 저장 탭을 클릭하면 자동 복구 정보 저장 간격을 설정할 수 있어요. 5분이나 10분으로 설정해두면 엑셀이 비정상 종료되어도 마지막 저장 지점부터 복구할 수 있어요.
자동 복구 파일은 보통 이런 경로에 저장돼요:
- C:\Users\사용자명\AppData\Roaming\Microsoft\Excel\
- C:\Users\사용자명\AppData\Local\Microsoft\Office\UnsavedFiles
실전에서 써보니 이게 편해요
저는 주로 이런 식으로 쓰고 있어요:
import openpyxl
import schedule
import time
from datetime import datetime
class ExcelAutoSaver:
def __init__(self, filename):
self.filename = filename
self.wb = openpyxl.Workbook()
self.ws = self.wb.active
def add_data(self, data):
self.ws.append(data)
def save(self):
self.wb.save(self.filename)
print(f"저장 완료: {datetime.now()}")
def save_with_timestamp(self):
timestamp = datetime.now().strftime('%Y%m%d_%H%M')
backup_name = f"{self.filename.split('.')[0]}_{timestamp}.xlsx"
self.wb.save(backup_name)
print(f"백업 저장: {backup_name}")
# 사용 예시
saver = ExcelAutoSaver('my_data.xlsx')
# 1분마다 자동 저장
schedule.every(1).minutes.do(saver.save)
# 30분마다 백업 생성
schedule.every(30).minutes.do(saver.save_with_timestamp)
while True:
# 데이터 추가
saver.add_data([datetime.now(), '샘플 데이터'])
schedule.run_pending()
time.sleep(1)
이렇게 클래스로 만들어두니까 여러 파일을 동시에 관리하기도 편하고, 나중에 기능을 추가하기도 쉬워요.
파이썬으로 엑셀 자동 저장을 구현하는 방법은 생각보다 간단해요. 기본적으로는 save() 메서드를 주기적으로 호출하면 되고, schedule 라이브러리를 쓰면 더 세밀한 조절이 가능해요. 백업 파일도 함께 만들어두면 더 안전하게 작업할 수 있어요.