EPI00 개발일지

파이썬으로 파일 압축하기 : pyminizip 본문

코딩 메모

파이썬으로 파일 압축하기 : pyminizip

EPI00 2023. 1. 26. 14:08

zipfile이라는 기본 라이브러리도 있고, shutil 라이브러리를 통해 압축하는것도 가능하겠지만 굳이 pyminizip을 사용하려는 이유는 바로 압축파일에의 비밀번호다. 
아마 검색을 통해 이 글에 들어온 사람들은 비밀번호 사용을 위해 pyminizip을 사용하려 했다가 오류가 났거나, 또는 파이썬으로 파일을 압축하는 방법을 찾기 위해 들어온 것일 것이다.

pyminizip은 CMD 또는 터미널 등에서 다음 명령어로 설치할 수 있다 :
pip install pyminizip
또는
python -m pip install pyminizip

pyminizip.compress() 함수가 아마 가장 자주 쓰일 함수일 것 같고, 그 이상은 나도 찾아본적이 없어 적지 않겠다. 하지만 아마 pypi에서 pyminizip을 찾아보면 어느정도 설명은 있지 않을까?

pyminizip.compress()는 5개의 인수를 받는 함수이다. 각각 순서대로 입력파일의 이름, 출력파일의 경로, 출력파일의 이름, 비밀번호, 압축률 이다. 예를 들어, 'asdf.txt'라는 파일을 압축해서 'qwerty'이라는 비밀번호가 걸린 'dir/asdf_comp.zip' 파일로 내보내고싶다면 다음과 같이 쓰면 된다 :
pyminizip.compress('asdf.txt','dir','asdf_comp.zip','qwerty',0)

이 때, 압축률은 0부터 9 사이의 정수가 들어갈 수 있으며, 0은 압축되지 않은 상태, 숫자가 클수록 더 많이 압축한다. 즉, 출력파일의 용량이 줄어든다. 

 

단, 한 가지 주의할 점이 있다. 
입력 파일이든 출력파일이든 그 파일 이름에 한글이 들어가면 다음의 에러가 발생한다 :

OSError: error in closing <filename> (-102)
물론 뭐 한글이 들어가서 에러가 발생한다는걸 예상해서 적당히 대처한 사람들도 있겠지만, 그런 사람들은 아마 이 글을 보러 오지 않을 것이기 때문에 해결법을 적는다. 
https://qiita.com/iikyara/items/512c83a447484c067825
위 문서를 참고하였고, 해당 문서에선 
OSError: error in opening <filename> for reading
이라는 에러를 해결하기 위해 압축률을 제외한 모든 인수를 cp932로인코딩했다. 
하지만 cp932는 윈도우에서 일본어를 표현하는 데에 쓰이는 인코딩이고, 우린 한글을 표현하는 인코딩을 사용할 필요가 있다. 때문에 똑같은 방식으로 각 인수에 .encode('cp949') 만 붙여준다면 잘 해결될 것이고, 나또한 그렇게 해결했다. 

아, 물론 cp932 및 cp949는 윈도우에서 사용하는 인코딩 방식이므로, 맥이나 리눅스 등에서 이 문제가 발생한다면 utf8이나 그런쪽으로 시도해보는 편이 좋을 것이다. 

'코딩 메모' 카테고리의 다른 글

한글로 코딩하는 것에 관하여  (0) 2020.11.02
pygame.display.set_mode 메모  (0) 2020.10.25