파이썬 표준 라이브러리 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')
첫 번째 인수에는 압축 파일에서 꺼내고 싶은 파일명을 지정합니다.
두 번째 인수에는 꺼낸 파일을 저장할 경로를 지정합니다.
댓글