[python] zipfile.ZipFile로 압축 해제 시 오류

작성 이유

  • 배포 전 압축 파일에 빈폴더가 있는지 확인하는 자동화 Tool 개발 시, zipfile 모듈을 사용했을 때 빈폴더를 파일로 압축해제하는 현상이 발생하여 원인 분석 후 해결 과정을 적재

 

1. 반디집(Bandizip)과 Python zipfile 모듈의 차이

Python zip file

1. 사용성 및 기능: Python의 zipfile 모듈은 파이썬 코드 내에서 직접 zip 파일을 생성하고, 읽고, 쓰고, 해제할 수 있는 기능을 제공합니다. 이는 프로그램 내에서 자동화된 작업이나 스크립트 작성을 용이하게 합니다.
2. 프로그램 통합: 파이썬 코드 내에서 다른 데이터 처리 작업과 쉽게 통합될 수 있습니다.
3. 제어와 유연성: 파일 압축 해제 과정에서 특정 파일을 선택적으로 해제하거나, 압축 해제된 파일을 즉시 처리하는 등의 세밀한 제어가 가능합니다.
4. 성능: 대부분의 경우 소규모 파일이나 적당한 크기의 파일에 대해 충분한 성능을 발휘합니다.
5.제한: GUI가 없으므로 사용자가 코드 작성을 필요로 하며, 대용량 파일에 대해서는 성능이 떨어질 수 있습니다.

 

반디집 (Bandizip)

1. 사용성 및 기능: 반디집은 GUI를 제공하여 사용자가 손쉽게 파일을 압축하고 해제할 수 있습니다. 다양한 포맷을 지원하며, 빠른 압축/해제 속도를 제공합니다.
2. 다양한 포맷 지원: ZIP뿐만 아니라 RAR, 7Z 등 다양한 포맷을 지원합니다.
3. 성능: 고성능의 압축 및 해제 기능을 제공하며, 특히 대용량 파일에 대해 빠른 속도를 보장합니다.
4. 추가 기능: 파일 탐색기 통합, 분할 압축, 암호 설정 등 다양한 추가 기능을 제공합니다.
5. 제한: 프로그램 실행이 필요하며, 스크립트 기반의 자동화 작업에는 적합하지 않습니다.

 

요약

Python zipfile 모듈은 스크립트 기반 자동화와 세밀한 제어가 필요할 때 유용합니다.
반디집은 GUI 기반의 사용자 친화적인 인터페이스와 고성능 압축/해제 기능이 필요할 때 적합합니다.

 

2. 원인 분석

1. zipfile 모듈의 동작 방식

zipfile 모듈은 기본적으로 파일과 디렉토리 항목을 처리하지만, 빈 디렉토리를 명시적으로 처리하지 않을 수 있습니다. 이는 ZIP 파일 내의 빈 디렉토리가 제대로 인식되지 않거나, 생성되지 않을 수 있기 때문입니다. zipfile 모듈은 파일을 추출할 때 디렉토리 구조를 생성하지만, 그 디렉토리 내에 파일이 없다면 디렉토리가 생성되지 않을 수 있습니다.

2. 반디집의 동작 방식

반디집은 GUI 기반의 압축/해제 도구로, ZIP 파일 내의 디렉토리 구조를 보다 정확하게 처리하고, 빈 디렉토리도 제대로 생성하는 기능을 갖추고 있습니다. 반디집은 ZIP 파일을 해제할 때 파일뿐만 아니라 폴더 구조도 함께 복원합니다.

 

3. 해결 방법

1. zip_ref.infolist() 를 활용하여 속성 값을 추출합니다

with zipfile.ZipFile(zip_path, 'r') as zip_ref:
    # 모든 파일을 순회하며 디렉토리 구조를 확인
    for member in zip_ref.infolist():
    	if (member.external_attr == 0x10) and (member.internal_attr ==1):
            print(member)
            print(member.file_size)

 

1. 폴더는 external_attr은 0x10 값을 가지는 것이 일반적입니다.

2. 위 for문에 디버깅 포트를 설정하여 Debug Console 창에서 zip_ref.infolist()를 검색하여 속성값 확인시 빈폴더를 파일로 인식하는 경우, internal_attr 속성이 1로 설정되어있음을 확인하였습니다.

 

이러한 조건을 if문으로 넣어 처리 시 zipfile 모듈로 압축 해제 시 빈폴더를 파일로 인식하는 오류를 해결하였습니다.