Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

ZIP 목록은 보이는데 읽을 수 없나요? 멤버별 방식과 Python 지원 확인

직접 만든 ZIP 4개로 목록 조회 성공, 지원하지 않는 압축 방식, CRC 오류를 구분했습니다.

원본 일러스트: Python 3.12.14에서 직접 만든 2멤버 ZIP 4개로 목록 조회, 미지원 방식, CRC 오류를 구분한 결과.
원본 일러스트: Python 3.12.14에서 직접 만든 2멤버 ZIP 4개로 목록 조회, 미지원 방식, CRC 오류를 구분한 결과. Watch at Ease

zipfile이 파일 목록은 보여 주지만 특정 파일을 읽을 때 NotImplementedError를 발생시킨다면 해당 멤버와 실제 작업을 실행하는 Python을 확인해야 합니다. 목록이나 앞선 멤버를 읽었다고 해서 ZIP의 모든 압축·암호화 기능을 지원한다는 뜻은 아닙니다.

Python 3.12.14에서 작은 2멤버 ZIP 표본 4개를 시험했습니다. 모두 목록 조회와 readme.txt 읽기에 성공했지만 data.csv에서는 성공, 미지원 방식 예외, CRC 오류가 각각 발생했습니다. 이 구분에 따라 다음 점검 대상이 달라집니다.

실제 읽기 환경과 모든 멤버를 기록하기

오류가 난 프로세스에서 sys.version과 zipfile.__file__을 기록합니다. 작업용 사본을 읽기 전용으로 열고 z.infolist()를 순회해 각 filename, compress_type, flag_bits, file_size, compress_size를 확인하세요. 스케줄러, 실행 환경, 같은 이름의 모듈이 우선 로드되는 상황 때문에 다른 곳에서 확인한 환경과 달라질 수 있습니다.

이 단계는 목록 점검이며 실제 내용의 디코딩 시험이 아닙니다. 첫 멤버의 방식을 전체에 적용하거나 is_zipfile() 성공을 전체 내용 읽기 성공으로 해석하면 안 됩니다. PKWARE 표는 Deflate64(9)와 AE-x 암호화 표시(99)도 구분합니다. Zstandard 지원 문제를 해결해도 이들 문제까지 자동으로 해결되지는 않습니다.

세 가지 시험 결과를 따로 기록하기

각 ZIP에는 비압축 readme.txt와 동일한 24바이트 data.csv를 넣었습니다. 비압축+Deflate(0/8)는 예상한 CSV를 반환했고 testzip()은 None이었습니다. 비압축+Zstandard(0/93)와 이전 Zstandard 번호(0/20)는 readme는 읽었지만 CSV 읽기와 testzip()에서 NotImplementedError가 발생했습니다.

네 번째 표본은 Deflate의 CRC 메타데이터를 의도적으로 틀리게 했습니다. data.csv 읽기는 BadZipFile을 발생시켰고 testzip()은 파일명을 반환했습니다. 예외, 문제 파일명 반환, None을 분리해서 기록하세요. 디코더가 지원되지 않으면 CRC는 아직 검증되지 않은 것이므로 손상 또는 무결성을 단정할 수 없습니다.

설치된 패키지와 내장 지원을 구분하기

설치된 zstandard 0.25.0은 직접 만든 Zstandard 프레임을 독립적으로 해제했습니다. 하지만 이를 가져와도 Python 3.12.14의 zipfile에는 ZIP_ZSTANDARD가 생기지 않았습니다. 별도 코덱이 작동한다고 ZIP 읽기 모듈이 그 코덱을 이용한다는 뜻은 아닙니다. 실제 인터프리터, 모듈, 빌드의 문서상 기능을 확인하세요.

Python 3.14 참조 문서는 ZIP_ZSTANDARD가 3.14에 추가되었고 compression.zstd가 필요하다고 설명합니다. 읽기는 방식 20·93, 쓰기는 93을 사용합니다. 이는 특정 버전의 문서이며 이번에 3.14를 실행한 결과도, 업그레이드하면 모든 압축·암호화·ZIP 기능을 처리한다는 보장도 아닙니다.

호환 경로를 선택하고 필요한 내용 검증하기

필수 멤버의 압축·암호화 특성을 해당 읽기 도구의 문서상 지원과 대조합니다. 필요하면 지원이 명시된 도구를 쓰거나 제공자에게 호환 사본을 다시 내보내 달라고 요청하고 원본은 보관하세요. 헤더의 방식 번호를 바꾸거나 암호화를 약화해 오류를 없애려 해서는 안 됩니다. Apache ZIP 가이드도 멤버별 지원 점검을 설명하며, 기존 방식 9·99 논의는 각기 다른 기능을 다룹니다.

적절한 제한이 적용된 환경에서 필수 멤버를 모두 읽고 CRC 결과와 애플리케이션이 기대하는 내용을 검증하세요. 이번에는 작은 비암호화 ZIP 4개에서 12개 검증 항목이 통과했으며 파일 추출은 하지 않았습니다. 신뢰할 수 없는 ZIP의 안전성, ZIP64, 분할 ZIP, 모든 Python 빌드를 검증한 것은 아닙니다. 연결된 일반 ZIP 가이드는 구조·CRC·필수 내용의 별도 검증 단계를 설명합니다.

원본 일러스트: 실제 실행 환경과 필수 멤버, 문서상 읽기 지원을 확인한 뒤 내용과 애플리케이션 요구를 검증하는 순서.
원본 일러스트: 실제 실행 환경과 필수 멤버, 문서상 읽기 지원을 확인한 뒤 내용과 애플리케이션 요구를 검증하는 순서. Watch at Ease