파일 포맷 다루기 - 실전 팁 모음¶
비개발자용. 엑셀/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 에러 나면:
PPT (python-pptx)¶
폰트 시스템¶
- PPT 안에서 한글 폰트 지정 시
Malgun Gothic(영문명) 사용 - 실제 시스템 폰트 이름과 다를 수 있으니 확인 필요
- 줄바꿈: txt 파일에서 PPT로 붙여넣기 시 CRLF(
\r\n) 필수 (LF만 쓰면 줄바꿈 무시됨)
텍스트 파일¶
CRLF vs LF¶
- Windows 앱(메모장, PPT, 한글 등)에서 사용할 파일: CRLF (
\r\n) - 코드/웹용 파일: LF (
\n) - Python에서 CRLF로 쓰기:
발견 이력¶
| 날짜 | 도구 | 함정 | 해결 |
|---|---|---|---|
| 2026-03-17 | openpyxl | HIRA xlsx dimension 오류 → 3행만 읽힘 | read_only=False로 전환 |
| 2026-03 | python-pptx | PPT 폰트 시스템 확립 | CLAUDE.md에 기록 |
| 2026-03 | txt 파일 | PPT 붙여넣기 시 줄바꿈 무시 | CRLF 강제 |