콘텐츠로 이동

파일 포맷 다루기 - 실전 팁 모음

비개발자용. 엑셀/PPT/PDF 등 파일을 Python으로 읽고 쓸 때 겪은 함정과 해결법.

한글(HWP) COM 자동화는 별도 문서: 14-hwp-com-automation.md


엑셀 (openpyxl)

함정: read_only=True로 열면 데이터가 잘리는 경우

증상: 17행짜리 파일인데 3~4행만 읽힘

원인: 일부 엑셀 파일(특히 웹에서 자동 생성된 것)은 내부 XML의 dimension 값이 틀리게 설정됨. read_only=True는 이 dimension만 보고 행 수를 결정해서 데이터가 잘림.

발견 사례: HIRA(심평원) 보건의료빅데이터개방시스템 다운로드 파일. dimension이 A1:AG4로 기록되어 있지만 실제 데이터는 18행(17개 시도).

# ✗ 위험 - 외부 파일은 데이터 잘릴 수 있음
wb = openpyxl.load_workbook('파일.xlsx', read_only=True)
ws = wb.active
rows = list(ws.iter_rows(values_only=True))  # dimension 범위만 읽음

# ✓ 안전 - 항상 전체 행 읽힘
wb = openpyxl.load_workbook('파일.xlsx')  # read_only=False (기본값)
ws = wb.active
for row in range(2, ws.max_row + 1):
    val = ws.cell(row=row, column=1).value

규칙: 외부에서 받은 xlsx는 항상 read_only=False(기본값)로 열기.

read_only=True vs False 비교

항목 read_only=True read_only=False (기본)
속도 빠름 (대용량에 유리) 느림
dimension 의존 예 - 잘못되면 데이터 잘림 아니오
셀 직접 접근 ws.cell() 불가 ws.cell(row, column) 가능
권장 상황 직접 만든 대용량 파일 외부 파일 (기본 선택)

범용 안전한 엑셀 읽기 함수

import openpyxl

def read_xlsx_safe(filepath, sheet_index=0):
    """dimension 문제 없이 안전하게 엑셀 읽기"""
    wb = openpyxl.load_workbook(filepath)  # read_only=False 필수
    ws = wb.worksheets[sheet_index] if isinstance(sheet_index, int) else wb[sheet_index]
    rows = []
    for row in range(1, ws.max_row + 1):
        row_data = []
        for col in range(1, ws.max_column + 1):
            row_data.append(ws.cell(row=row, column=col).value)
        if any(v is not None for v in row_data):
            rows.append(row_data)
    wb.close()
    return rows

검증 습관

새 엑셀 파일을 처음 읽을 때 항상 확인:

wb = openpyxl.load_workbook('파일.xlsx')
ws = wb.active
print(f'max_row={ws.max_row}, max_column={ws.max_column}')
# 예상 행 수와 다르면 → 데이터 확인

한글 인코딩 출력

Windows에서 print()가 cp949 에러 나면:

import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

PPT (python-pptx)

폰트 시스템

  • PPT 안에서 한글 폰트 지정 시 Malgun Gothic (영문명) 사용
  • 실제 시스템 폰트 이름과 다를 수 있으니 확인 필요
  • 줄바꿈: txt 파일에서 PPT로 붙여넣기 시 CRLF(\r\n) 필수 (LF만 쓰면 줄바꿈 무시됨)

텍스트 파일

CRLF vs LF

  • Windows 앱(메모장, PPT, 한글 등)에서 사용할 파일: CRLF (\r\n)
  • 코드/웹용 파일: LF (\n)
  • Python에서 CRLF로 쓰기:
with open('파일.txt', 'w', encoding='utf-8', newline='\r\n') as f:
    f.write('첫째 줄\r\n둘째 줄\r\n')

발견 이력

날짜 도구 함정 해결
2026-03-17 openpyxl HIRA xlsx dimension 오류 → 3행만 읽힘 read_only=False로 전환
2026-03 python-pptx PPT 폰트 시스템 확립 CLAUDE.md에 기록
2026-03 txt 파일 PPT 붙여넣기 시 줄바꿈 무시 CRLF 강제