Python으로 윈도우에서 압축한 zip 파일 압축해제가 안 될 때

회사에서 작업하다가 윈도우에서 압축했던 zip 파일 하나가 python으로 압축 해제가 되지 않아서 곤란했던 적이 있다. 관련해서 구글링 하다가 이를 명쾌하게 해결해 준 (거의 유일한) 일본어 페이지가 하나 있어 이를 참고해 한국어로 된 글을 글을 작성하기로 했다.

참고 페이지(일본어): https://tarepan.hatenablog.com/entry/2018/11/18/035326

일단 나타나는 에러 내용은 다음과 같다.

    zip.extract(member=file, path=path)
  File ".../.pyenv/versions/3.7.10/lib/python3.7/zipfile.py", line 1619, in extract
    return self._extract_member(member, path, pwd)
  File ".../.pyenv/versions/3.7.10/lib/python3.7/zipfile.py", line 1689, in _extract_member
    with self.open(member, pwd=pwd) as source, \
  File ".../.pyenv/versions/3.7.10/lib/python3.7/zipfile.py", line 1560, in open
    return ZipExtFile(zef_file, mode, zinfo, pwd, True)
  File ".../.pyenv/versions/3.7.10/lib/python3.7/zipfile.py", line 809, in __init__
    self._decompressor = _get_decompressor(self._compress_type)
  File ".../.pyenv/versions/3.7.10/lib/python3.7/zipfile.py", line 722, in _get_decompressor
    raise NotImplementedError("compression type %d (%s)" % (compress_type, descr))
NotImplementedError: compression type 9 (deflate64)

혹은 Python 3.9라면 그냥 not supported로만 나타나기도 한다.

  File ".../.pyenv/versions/3.9.7/lib/python3.9/zipfile.py", line 678, in _check_compression
    raise NotImplementedError("That compression method is not supported")
NotImplementedError: That compression method is not supported

이런 오류는 일반적인 파일에서는 문제가 없는데, 용량이 큰 경우 발생하는 것으로 추측된다. (원 저자의 경우 1.6GB정도 파일에서만 문제가 발생했다고 하는데, 나는 압축 후의 용량이 563MB인 zip에서부터 이런 문제가 발생했다)

오류 내용을 보면 직접적인 원인은 간단하다. 압축에 사용된 알고리즘인 deflate64를 파이썬의 zipfile이 지원하지 않아서 생기는 문제다. 그런데 왜 지원을 안 하는 걸까.

https://github.com/thejoshwolfe/yauzl/issues/58#issuecomment-307123548

대부분은 그냥 원래 안된다 정도로 말하고 있는데, 위의 링크에서 관련한 내용을 좀 더 풀어서 이야기하고 있다.
요약하면 사유(propriteary) 소프트웨어이기 때문에 대부분의 오픈 소스 프로젝트들에서는 이를 지원하지 않는다고 한다.
( 한국어 위키백과에서는 propriteary software를 사유 소프트웨어 혹은 클로즈드 소스 소프트웨어로 표기하고 있다: https://ko.wikipedia.org/wiki/사유_소프트웨어)

deflate64 알고리즘을 소개하는 다른 문서에서도 꼬박꼬박 TM 을 붙이는 것을 봐서, 상표권 등록까지 되어있는 모양.

하지만 윈도우에서는 이를 정식으로 지원하고 있어서 윈도우에서는 특정 상황(상기한 것처럼 용량이 클 때)에서 자동으로 deflate64를 사용해서 압축하고 있는데, 파이썬은 deflate64를 지원하지 않기 때문에 생기는 문제인 것이다.

해결하는 방법은 의외로 간단하다. 윈도우 자체의 압축 기능을 안 쓰면 된다.

python zipfile 같은 것으로 압축시키는 방법도 있고, 윈도우 환경에서라도 윈도우 자체의 압축 기능을 사용하지 않으면 (ex: 반디집) 전혀 문제 없는 것 같다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다