Python 에서 zipfile 모듈을 사용할 때, 경로 문제

요즘 ChatGPT 덕분에 파이썬 사용하는게 너무 재미있다. 그냥 적당히 대화만 하면 모르는 걸 싹 알려주니까 너무 편하고 좋다.

최근 개인적으로 사용할 유틸리티를 만들면서 zipfile 모듈을 사용할 일이 있었는데, 처음 ChatGPT 가 알려준 코드는 이랬다.

def CreateZIP(output_zip, *files):
    with zipfile.ZipFile(output_zip, 'w') as zf:
        for file in files:
            zf.write(file, file)

압축은 잘 되었는데, 소스 파일의 경로가 그대로 입력이 되었다. 만약 압축할 파일의 원래 경로가 C:\Temp\a.txt 라면, 압푹 파일을 Download 폴더에 옮겨서 풀어도 …\Download\Temp\a.txt 가 되는 식이다.

ChatGPT 에게 다시 물어보니까 수정된 코드를 제시해 줬다.

def CreateZIP(output_zip, *files):
    with zipfile.ZipFile(output_zip, 'w') as zf:
        for file in files:
            zf.write(file, os.path.basename(file))

뒤에 경로를 os 모듈의 basename 함수를 이용해서 파일명만 추출해서 집어 넣었다. 이렇게 하니까 잘 되는거 같았는데, 몇몇 파일 뷰어와 다른 OS 의 캘리버에서 문제가 생겼다. 간헐적으로 제대로 읽지 못하거나 Cover 이미지를 생성하지 못하거나 했다.

이래저래 분석해 보니까, 상대 경로를 제대로 처리하지 못하는 것이 원인인 것 같았다. 그래서 그냥 강제로 root 경로를 삽입해 주었더니 잘 되었다!! 코드는 다음과 같다.

def CreateZIP(output_zip, *files):
    with zipfile.ZipFile(output_zip, 'w') as zf:
        for file in files:
            pathTemp = os.path.join('root', os.path.basename(file) )
            zf.write(file, pathTemp)

사실, 너무 짜친 내용이라 포스팅까진 안 하려고 했는데, 까먹어서 ChatGPT 한테 다시 물어 보려다가, 이전 소스를 찾아서 얼른 메모 겸 포스팅 한다. 제발 까먹지 좀 말자. T^T

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다