본문 바로가기

Programming/Python

zip 파일 압축/해제 방법

반응형

파이썬을 사용하면 zip 파일을 다루는 것이 편리합니다.

라이브러리의 zipfile을 사용하면 간단하게 zip 파일을 생성하고 압축을 푸는 것이 가능합니다.

zipfile을 사용한 압축과 압축해제 소스코드입니다.

import zipfile
import os

def unzip(source_file, dest_path):
    with zipfile.ZipFile(source_file, 'r') as zf:
        zf.extractall(path=dest_path)
        zf.close()

def zip(src_path, dest_file):
    with zipfile.ZipFile(dest_file, 'w') as zf:
        rootpath = src_path
        for (path, dir, files) in os.walk(src_path):
            for file in files:
                fullpath = os.path.join(path, file)
                relpath = os.path.relpath(fullpath, rootpath);
                zf.write(fullpath, relpath, zipfile.ZIP_DEFLATED)
        zf.close()

if __name__ == "__main__":
    unzip('E:\\temp\\Sources.zip', 'E:\\temp\\result')
    zip('E:\\temp\\result\\Sources', 'E:\\temp\\result\\res.zip')

먼저 압축해제(unzip)은 아주 간단하게 가능합니다.

zipfile.ZipFile로 파일을 읽기 권한('r')로 오픈하고 extractall()만 호출하면 됩니다.

특정 파일만 압축을 풀고 싶을 때는 extract를 사용해서 zipfile의 내부에 포함된 파일 중 일부만 풀 수 있습니다.

압축(zip)은 약간 복잡한 편입니다.

먼저 압축을 할 디렉토리를 rootpath에 저장합니다.

rootpath는 상대경로를 구하기 위해서 저장해 놓습니다.

이제 os.walk()로 해당 디렉토리의 전체 파일을 순회합니다.

파일 리스트에서 파일을 가져오고 전체 경로를 생성(os.path.join())합니다.

그리고 상대 경로를 생성(os.path.relpath())합니다.

write를 할 때 가장 앞에 절대 경로를 입력해야 정상적으로 압축 파일에 추가됩니다.

그리고 뒤에 상대 경로를 입력해서 일반적인 압축 파일의 형태로 만들어 줍니다.

만약 상대 경로를 입력하지 않으면 예제에서는 temp\result\Sources라는 디렉토리 구조가 생성됩니다.

그것을 방지하기 위해서 상대 경로를 활용하는 것입니다.

파일이 정상적으로 압축되면 파일을 닫아주면 됩니다.

마지막으로 정상적으로 압축이 되고 해제됐는지 확인하면 됩니다.

반응형