Python 파일 압축 또는 풀기 zipfile 모듈 사용 방법

파이썬 표준 라이브러리 zipfile 모듈을 사용해 파일을 ZIP으로 압축하거나 ZIP 파일을 해제하거나 할 수 있습니다.

표준 라이브러리를 사용하기 때문에 추가로 설치하지 않아도 됩니다.

 

파일 압축 하기

ZIP 파일로 압축을 할 때에 4가지 종류가 있습니다.

종류내용
 zipfile.ZIP_STORED 압축하지 않고 파일을 한곳에 이동
 zipfile.ZIP_DEFLATED 일반 ZIP 압축
 zipfile.ZIP_BZIP2 BZIP2 압축
 zipfile.ZIP_LZMA LZMA 압축

 

BZIP2와 LZMA가 압축률은 높지만 압축하는데 시간이 오래 걸립니다.

사용 방법을 보겠습니다.

import zipfile
       
new_zip= zipfile.ZipFile('data/temp/new_comp.zip', 'w')
new_zip.write('data/temp/test1.txt', compress_type=zipfile.ZIP_DEFLATED)

new_zip.close()

 

ZipFile 객체를 열 때는 첫 번째 인수에는 파일 경로와 ZIP 파일 이름을, 두 번째 인수를 w로 지정해서 쓰기 모드로 엽니다. 

write() 메서드에는 첫 번째 인수에는 압축하고 싶은 파일이 있는 경로와 파일 이름을 작성합니다.

두 번째 인수에는 압축 종류를 설정합니다.

압축이 끝나면 close()를 사용해 닫습니다.

여러개 파일을 압축하는 방법을 보겠습니다.

import os
import zipfile
 
new_zips= zipfile.ZipFile('data/temp/new_comps.zip', 'w')
 
for folder, subfolders, files in os.walk('data/temp/'):
 
    for file in files:
        new_zips.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), 'data/temp/'), compress_type = zipfile.ZIP_DEFLATED)
 
new_zips.close()

 

지정한 폴더에 있는 파일을 압축하고 있습니다.

위 예제에서는 for 문을 사용했지만 with를 사용해서도 복수 파일을 압축할 수 있습니다.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

 

with를 사용한 경우에는 close()를 하지 않아도 자동으로 닫힙니다.

 

기존 ZIP 압축 파일에 파일 추가

이미 만들어져 있는 ZIP 압축 파일에 새로운 파일을 추가하기 위해서는 두 번째 인수를 a로 지정합니다.

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

 

ZIP 압축 파일 풀기

ZIP 압축 파일을 해제하고 싶은 경우에는 두 번째 인수를 r로 지정합니다.

with zipfile.ZipFile('data/temp/new_comp.zip', 'r') as existing_zip:
    existing_zip.extractall('data/temp/ext')

 

두 번째 인수를 생략해도 ZIP 압축 파일을 해제합니다.

기본값이 r로 되어있기 때문에 생략한 경우는 압축을 해제합니다.

압축파일에 원하는 파일만 꺼내고 싶은 경우는 extract() 메서드를 사용합니다.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

 

첫 번째 인수에는 압축 파일에서 꺼내고 싶은 파일명을 지정합니다.

두 번째 인수에는 꺼낸 파일을 저장할 경로를 지정합니다.

댓글