zipfile을 이용하면 zip 파일의 압축을 해제할 수 있다.

 

파일이 한글일 경우 깨짐 현상이 발생하는데,

구글링하면 이를 해결한 글을 찾을 수 있다.

http://www.hanbit.co.kr/media/channel/view.html?cms_code=CMS8947142043

 

파이썬을 사용해 한글 파일명을 포함한 ZIP 파일 압축 해제

ZIP 압축과 인터넷 인터넷을 사용하는 인구가 늘면서 많은 사람이 대용량의 파일을 주고 받기 시작했다. 인터넷 이전의 지역적인 통신망이었던 PC 통신에서도 여러 개의 파일을 주고 받기 위해 다양한 압축 유틸리티가 사용되었다. 많은...

www.hanbit.co.kr

 

그런데 python 2.x만 가능하고, python 3.x에는 적용되지 않는다.

python 3.x 관련글을 찾으려 했으나, 아무런 포스팅이 없다.

 

그래서 이래저래 찾아본 결과 해결책을 찾을 수 있었다.

결과적으로

기존 member.filename = member.filename.decode("euc-kr").encode("utf-8")를

member.filename.encode('cp437').decode('euc-kr')로 변경하면 된다.

 

풀 코드는 아래처럼 쓰면 된다.

(참고로 이전 글의 함수에서 dest_path 기능이 없길래 추가했다.)

def unzip(source_file, dest_path):
    with zipfile.ZipFile(source_file, 'r') as zf:
        zipInfo = zf.infolist()
        for member in zipInfo:
            try:
                print(member.filename.encode('cp437').decode('euc-kr', 'ignore'))
                member.filename = member.filename.encode('cp437').decode('euc-kr', 'ignore')
                zf.extract(member, dest_path)
            except:
                print(source_file)
                raise Exception('what?!')

 

하지만 euc-kr로 표현되지 않는 파일명은 여전히 깨지긴한다.

  1. 돌핀와우 2021.06.05 16:57

    좋은 정보 감사합니다.
    위 내용 중에 utf-8로 decode 하는 부분을 이렇게 수정하니 잘 나오는 것 같습니다.

    member.filename = member.filename.encode('cp437').decode('utf-8')

+ Recent posts