ZIP 안에는 항목이 세 개라고 나오는데 압축을 풀고 보니 파일이 두 개만 남을 수 있습니다. 모든 경우가 다운로드 손상은 아닙니다. ZIP 내부에 같은 전체 경로 이름이 두 번 들어 있으면 추출 과정에서 한 파일 경로에 겹칠 수 있습니다. 직접 작은 ZIP을 만들어 항목 수와 고유 경로 수를 비교했습니다.
만든 ZIP의 구성
Python 3.14.6 zipfile로 report.txt를 두 번 넣었습니다. 첫 항목은 total=1200, 두 번째는 total=1201이며 마지막에 readme.txt를 추가했습니다. 모두 실행 기능이 없는 가상 텍스트 파일입니다. 폴더 밖으로 나가는 경로나 큰 파일을 포함하지 않습니다.

| 순서 | ZIP 내부 경로 | 내용 |
|---|---|---|
| 1 | report.txt | total=1200 |
| 2 | report.txt | total=1201 |
| 3 | readme.txt | 설명 문장 |
실제 읽기와 추출 결과
ZipFile.infolist()는 항목 세 개를 반환했습니다. 각 ZipInfo 객체를 지정해 읽으면 첫 report.txt와 두 번째 report.txt의 내용이 각각 보였습니다. 그러나 이름 report.txt만 지정해 읽은 결과는 두 번째 항목 total=1201이었습니다. 새 빈 폴더에 Python zipfile로 추출한 뒤에도 report.txt에는 total=1201이 남았고 전체 파일은 두 개였습니다.
| 검사 | 결과 | 해석 |
|---|---|---|
| 항목 수 | 3 | 같은 이름도 별도 항목 |
| 고유 전체 경로 수 | 2 | report.txt가 중복 |
| CRC 검사 | 오류 없음 | 이 중복을 오류로 판단하지 않음 |
| 추출 후 파일 수 | 2 | 같은 경로가 겹침 |
이 동작은 이번 Python zipfile 시험 결과입니다. Windows 탐색기·macOS 압축 유틸리티·다른 압축 프로그램이 어떤 경고를 띄우고 어느 항목을 남기는지는 여기서 시험하지 않았습니다. 프로그램마다 처리 결과가 다를 수 있으므로 “항상 마지막 파일이 남는다”고 일반화하지 않습니다.
압축을 풀기 전에 확인할 것
- 받은 ZIP 원본을 보존합니다. 바로 같은 폴더에 덮어 풀지 않습니다.
- 압축 프로그램의 파일 목록에서 파일명뿐 아니라 전체 내부 경로를 확인합니다.
- 전체 항목 수와 고유 경로 수를 구분합니다. 폴더 항목도 개수에 들어갈 수 있습니다.
- 압축 해제 예상 크기와 남은 디스크 공간을 확인합니다.
- 같은 경로가 여러 번 나오면 보낸 사람에게 어떤 항목이 최종본인지 확인합니다.
이름은 같지만 경로가 다른 경우
draft/report.txt와 final/report.txt는 파일 이름은 같아도 전체 경로가 다릅니다. 폴더 구조를 유지해 추출하면 두 경로를 구분할 수 있습니다. 이 실험처럼 report.txt 자체가 두 번 있는 경우와 혼동하지 마십시오. 반대로 일부 앱에서 폴더 구조를 무시하고 한 폴더로 모으면 원래 다른 경로도 충돌할 수 있습니다.
이미 풀었는데 파일이 적을 때
원본 ZIP을 삭제하지 않았다면 내부 항목 목록과 추출 폴더를 다시 비교합니다. 중복 항목이 존재하면 둘 중 하나를 임의로 최종본으로 정하지 않습니다. 같은 이름의 내용을 각각 별도 이름으로 보존할 수 있는 도구나 보낸 사람의 재압축본이 필요합니다. 원본이 없고 덮어쓴 항목만 남았다면 파일 개수만으로 사라진 내용을 재구성할 수 없습니다.
백업용 ZIP을 만들 때는 정상 종료 여부와 CRC 검사만으로 끝내지 말고, 기대한 파일 목록과 고유 경로가 맞는지 확인해야 합니다. 파일 내용까지 중요하면 각 파일의 해시 목록과 비교하면 도움이 됩니다. 파일 해시 비교 안내는 발행 후 해당 자료에서 확인할 수 있습니다.
시험용 ZIP
중복 이름 ZIP 내려받기를 새 빈 시험 폴더에서 살펴볼 수 있습니다. 실제 업무 파일과 섞지 마십시오. 이 파일의 정상 목록은 항목 3개·고유 경로 2개이며 report.txt 두 항목의 수치는 서로 다릅니다. 실험의 목적은 중복을 발견하는 것이지 어느 내용을 최종본으로 선택하는 것이 아닙니다.
