거래처에서 받은 xlsx 파일을 열었더니 "파일이 손상되어 열 수 없습니다" 창이 뜨는 상황, 다들 한 번쯤 겪어 보셨을 겁니다. 그런데 이 메시지가 뜨는 이유는 하나가 아닙니다. 진짜로 파일이 깨진 경우도 있고, 애초에 확장자만 xlsx일 뿐 안에 든 건 다른 문서인 경우도 있습니다.
확장자를 바꾼다고 파일 내용까지 바뀌는 게 아니라는 이야기는 예전에 다룬 적이 있는데, 이번엔 그 반대 상황, 그러니까 확장자만 xlsx인 척하는 파일이 실제로 어떻게 걸러지는지를 봅니다. 두 경우를 실제로 만들어서, 각각 어떤 흔적을 남기는지 파이썬으로 직접 열어 비교해 봤습니다.

케이스 1. 진짜로 손상된 파일
정상 xlsx 파일 하나를 만든 뒤, 파일 끝부분 500바이트를 잘라내 일부러 망가뜨렸습니다. zip은 파일 맨 끝에 "여기 안에 뭐가 들었는지" 요약해 둔 목차(중앙 디렉터리)를 두는데, 이 부분이 날아가면 압축 프로그램이 내용물을 찾지 못합니다.
>>> import zipfile
>>> zipfile.ZipFile("corrupt.xlsx")
BadZipFile: File is not a zip file
파이썬 표준 라이브러리도, 엑셀도, 압축 프로그램도 똑같이 이 파일을 zip으로 인식하지 못합니다. 확장자를 zip으로 바꿔 열어 봐도 "압축 파일이 손상되었거나 형식이 잘못되었습니다" 같은 메시지가 뜨는 게 이 케이스입니다.
케이스 2. 확장자만 xlsx, 안에 든 건 다른 문서
이번엔 실제로 손상된 데이터가 아니라, 워드 문서(docx) 구조를 흉내 낸 zip을 만들어 확장자만 .xlsx로 저장했습니다.
>>> import zipfile
>>> with zipfile.ZipFile("fake.xlsx") as z:
... print(z.namelist())
['[Content_Types].xml', 'word/document.xml']
>>> import openpyxl
>>> openpyxl.load_workbook("fake.xlsx")
OSError: File contains no valid workbook part
zip으로는 멀쩡하게 열립니다. 압축 프로그램에 넣으면 내부 목록도 정상적으로 보입니다. 그런데 xl 폴더도, workbook.xml도 없이 word 폴더만 있으니, 엑셀 입장에서는 "이건 내가 아는 구조가 아니다"라며 손을 듭니다. 같은 "손상됐다"는 메시지라도, 실제로는 파일이 깨진 게 아니라 다른 프로그램용 문서에 확장자만 xlsx가 붙어 있던 것입니다.
케이스 3. 가장 헷갈리는 경우, 오류조차 안 뜨는 부분 손상
앞의 두 케이스는 그나마 양반입니다. 더 골치 아픈 건 zip 구조는 멀쩡한데 안에 든 파일 하나만 빠진 경우입니다. 정상 xlsx에서 시트 내용이 담긴 xl/worksheets/sheet1.xml 딱 하나만 지우고 나머지는 그대로 둔 파일을 만들어 열어 봤습니다.
>>> import zipfile
>>> with zipfile.ZipFile("partial.xlsx") as z:
... print(z.namelist())
['docProps/app.xml', 'docProps/core.xml', 'xl/theme/theme1.xml',
'xl/styles.xml', '_rels/.rels', 'xl/workbook.xml',
'xl/_rels/workbook.xml.rels', '[Content_Types].xml']
>>> # xl/worksheets/sheet1.xml만 쏙 빠져 있습니다
>>> import openpyxl
>>> wb = openpyxl.load_workbook("partial.xlsx")
>>> wb.sheetnames
[]
오류가 아예 안 뜹니다. openpyxl은 파일을 정상적으로 열었다고 판단하고, 다만 시트가 하나도 없는 빈 통합 문서처럼 돌려줍니다. workbook.xml 안에는 여전히 "시트가 하나 있다"는 참조가 남아 있는데, 정작 그 시트의 실체(sheet1.xml)가 없으니 조용히 건너뛰어 버리는 것입니다. 이 케이스가 실무에서 가장 위험합니다. 파일이 손상됐다는 신호 자체가 없어서, 데이터가 통째로 사라진 걸 뒤늦게 알아차리기 쉽습니다.
실제 엑셀 프로그램에서는 이런 파일을 열면 "일부 콘텐츠에 문제가 발견되어 복구를 시도했습니다" 같은 안내가 뜨는 경우가 많지만, 프로그램이나 손상 부위에 따라 안내 없이 빈 시트만 보여줄 수도 있습니다. 시트 개수나 마지막 저장 시점의 행 수를 기억해 두고, 파일을 받을 때마다 어긋나지 않는지 확인하는 습관이 이런 조용한 손상을 잡아내는 유일한 방법입니다.
두 경우, 실무에서는 이렇게 다릅니다
| 구분 | 케이스1 완전 손상 | 케이스2 확장자 위장 | 케이스3 부분 손상 |
|---|---|---|---|
| zip으로 열었을 때 | 안 열림, 오류 메시지 | 정상적으로 열림 | 정상적으로 열림 |
| 내부 폴더 구성 | 확인 불가 | xl 대신 word, ppt 등 다른 구조 | xl 폴더는 있으나 일부 파일 누락 |
| openpyxl로 열면 | 즉시 오류 | 즉시 오류 | 오류 없이 열림, 시트가 비어 있음 |
| 복구 가능성 | 손상 정도에 따라 다름, 항상 가능한 건 아님 | 복구가 아니라 올바른 확장자로 바꾸면 바로 해결 | 빠진 부분은 복구 어려움, 다른 백업본 필요 |
| 원인 | 전송 중 끊김, 저장 중 강제 종료 등 | 다른 형식 파일에 확장자를 잘못 붙임, 확장자 위장 배포 | 압축 도구나 전송 과정에서 파일 일부만 누락 |
실무에서 자주 벌어지는 확장자 위장은 대부분 실수입니다. 파일 이름을 바꾸다 확장자까지 잘못 건드리거나, 다른 형식으로 저장한 걸 깜빡하고 xlsx라 부르는 경우입니다. 반대로 출처가 불분명한 곳에서 받은 파일이 이런 식으로 열린다면 내용을 함부로 실행하지 말고 원래 어떤 형식인지부터 확인하는 편이 안전합니다.
지금 안 열리는 파일로 바로 확인하려면
탐색기에서 복사본을 만들어 확장자를 .zip으로 바꾸고 더블클릭해 보는 것으로 충분합니다. 압축 프로그램 자체가 안 열린다고 하면 케이스 1, 열리는데 안에 xl 폴더가 없다면 케이스 2입니다. 코드로 확인하고 싶다면 아래처럼 짧게 끝납니다.
import zipfile
try:
with zipfile.ZipFile("확인할파일.xlsx") as z:
names = z.namelist()
if not any(n.startswith("xl/") for n in names):
print("zip은 열리지만 엑셀 구조가 아님 → 확장자 위장 의심")
elif not any(n.startswith("xl/worksheets/") for n in names):
print("xl 폴더는 있지만 시트 파일이 없음 → 부분 손상 의심")
else:
print("정상적인 xlsx 구조")
except zipfile.BadZipFile:
print("zip 자체가 깨짐 → 실제 손상 의심")
자주 묻는 질문
Q. 실제로 손상된 파일도 복구할 수 있나요?
손상 부위와 정도에 따라 다릅니다. 엑셀 자체의 "손상된 통합 문서 복구" 기능이 일부 복구해 주는 경우도 있지만, 이번처럼 목차 자체가 날아간 손상은 복구가 어려울 수 있습니다.
Q. 압축 프로그램마다 판단이 다를 수 있나요?
드물게 있습니다. 프로그램마다 손상 허용 범위가 달라 한쪽은 열리는데 한쪽은 안 열리는 경우도 있어, 여러 프로그램으로 시도해 볼 만합니다.
같은 오류 메시지라도 원인은 완전히 다를 수 있습니다. 재전송을 요청하기 전에, 확장자만 zip으로 바꿔 열어 보는 한 단계만 거치면 어느 쪽인지 금방 갈립니다.
위 오류 메시지는 실제로 손상시킨 파일과 구조를 위장한 파일을 각각 파이썬으로 열어 재현한 결과입니다.
'파일 형식 백과사전' 카테고리의 다른 글
| 폰트를 설치했는데 프로그램 목록에 안 보일 때, 원인을 구분하는 법 (1) | 2026.08.28 |
|---|---|
| 엑셀 조건부 서식 규칙이 수백 개로 쪼개지는 이유, 200번 복사 붙여넣기를 직접 재현 후기 (0) | 2026.08.26 |
| 가변 폰트(Variable Font)란, 파일 하나로 굵기가 바뀌는 원리를 열어서 확인했습니다 (0) | 2026.08.24 |
| 엑셀에는 15%로 보이는데, 파이썬으로 읽으면 왜 0.15가 나올까 (0) | 2026.08.23 |
| 한컴 없이 hwp 열기, 확장자 바꾸기가 안 통하는 이유와 실제로 되는 방법 (0) | 2026.08.15 |