본문 바로가기
SW 개발/Python

Python으로 압축 파일 다루기: Zipfile 과 shutil.make_archive()

by Kibua20 2021. 1. 14.

Python에서 압축 파일은 내장 모듈인 Zipfile 모듈과 shutil.make_archive()와 shutil.unpack_archive()을  이용하여 다룰 수 있습니다. 

 

Zipfile 모듈은 python 기본 내장 모듈로, Zip 파일을 압축하고, 읽고, 저장, 리스트를 얻어올 수 있습니다. 압축 알고리즘은 Deflate, BZip, LZMA 알고리즘을 지원합니다. 또한 4GB 이상의 Zip 파일인 Zip64도 처리할 수 있습니다. Zipfile 모듈의 문서는 링크를 참고해주세요. 

 

shutil.make_archive() 함수와 shutil.unpack_archive()은 zip, tar, gztar, bztar를 지원합니다. 코드 한줄로 폴더를 압축할 수 있습니다. 

 

Zipfile 모듈 - zip 파일 압축 해제

# zip  모듈 import

import zipfile

 

def extract_zip(zip_name):

    #  zipfile 객체 생성하고 zip 으로 할당

    with zipfile.ZipFile(zip_name) as zip:

       # zip 파일 안에 파일 list을 출력

        print (zip.namelist())

 

       # zip 파일 내부의 파일 1개씩 압축해제           

       for f in zip.namelist():

            zip.extract(f)

 

       # zip 파일 내부의 모든 파일을 압축 해제

       zip.extractall()

 

       # 생략 가능: context 관리자로 close는 생략 가능

       zip.close()

 

 

Zipfile 모듈- 파일 압축

ZipFile을 객체를 'w' mode 옵션으로 만들고 압축 알고리즘을 지정합니다. 기본 값이 Zip Store 이기 때문에 압축 없이 zip 파일에만 추가되니,  ZIP_DEFLATE와 compression level을 지정해서 사용하는 것을 추천됩니다.  사용 압축 효율을 높이고자 하는 경우 BZIP2나 LZMA를 사용할 수 있습니다. Bzip2과 LZMA은 압축 효율은 높으나 처리 속도가 느립고,  Python v3.3 버전부터 사용 가능합니다. 

 

# zip  모듈 import

import zipfile

 

# sample.zip파일에 file.txt를  압축한다.  Zip알고리즘은 Deflate 압축을 사용

with ZipFile('sample.zip', 'w', compression= ZIP_DEFLATE) as myzip:

    myzip.write('file1.txt')

 

 

Zipfile class  주요 parameter 와 함수

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True)

 

  * mode: 기존 파일을 읽으려면 'r',  새 파일을 자르고 쓰려면 'w', 기존 파일에 추가하려면 'a'

  * compression: 아카이브를 기록할 때 사용할 ZIP 압축 방법이며, ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2 또는 ZIP_LZMA 이어야 합니다;

 

Zip 알고리즘 내용
 zipfile.ZIP_STORED 압축하지 않고 파일을 Zip으로만 묶음, 속도 빠름
 zipfile.ZIP_DEFLATED 일반 ZIP 압축, 속도 빠름, 압축률 낮음, 호환성 좋음
 zipfile.ZIP_BZIP2 BZIP2 압축, 압축률 높음, 속도 느림 (Python v3.3 이후 버전)
zipfile.ZIP_LZMA LZMA 압축, 압축률 높음, 속도 느림 (Python v3.3 이후 버전)
7Zip 과 동일 알고리즘

 

* compresslevel: 파일을 아카이브에 기록할 때 사용할 압축 수준을 제어합니다. ZIP_STORED ZIP_LZMA를 사용할 때는 효과가 없습니다. ZIP_DEFLATED를 사용할 때는 0에서 9까지의 정수가 허용됩니다. ZIP_BZIP2를 사용할 때는 1부터 9까지의 정수가 허용됩니다. 

 

* allowZip64:  ZIP 파일이 4GiB보다 클 때 ZIP64 확장을 사용하는 ZIP 파일을 만듭니다.

 

ZipFile.setpassword(pwd)

→ 암호화된 파일을 추출하기 위해 pwd를 기본 비밀번호로 설정합니다.

 

ZipFile.testzip(

Zip의 CRC와 파일 헤더를 확인합니다. 

 

 

shutil.make_archive()와 unpack_archive함수 활용

shuil 모듈에서도 압축 파일 만들 수 있습니다.  zip, tar, gztar, bztar, xztar를 지원합니다. 

 

import os, shutil

 

def make_archive(source, destination):

    base = os.path.basename(destination)

    name = base.split('.')[0]

    format = base.split('.')[1]

   archive_from = os.path.dirname(source)

    archive_to = os.path.basename(source.strip(os.sep))

    shutil.make_archive(name, format, archive_from, archive_to)

   shutil.move('%s.%s'%(name,format), destination)

 

make_archive('/path/to/folder', '/path/to/folder.zip')

→ folder를 folder.zip 파일로 만든다 

 

 shutil.unpack_archive(archive_file_name, extact_dir)

→ 압축 해제, 확장자를 가지고 압축 알고리즘 판단

 

관련 글

[모바일 SW 개발/Python] - Python 음수 인덱스: line.split('+')[-1] 또는 line.split('/')[-1] 의미

[모바일 SW 개발/Python] - Python에서 URL 한글 깨짐 현상: quote_plus()와 unquote_plus()

[모바일 SW 개발/Android] - Python BeautifulSoup으로 만든 Apk download 자동화 (Sample code)

[모바일 SW 개발/Android] - Android apk Decompile 과 분석 tool: apktool 사용법

[모바일 SW 개발/Python] - Python: 날짜와 시간 처리 함수(현재 날짜, 어제 날짜, UTC 시간)

[모바일 SW 개발/Python] - Python: xmltodict를 활용하여 XML를 JSON으로 변환하는 방법

[모바일 SW 개발/Python] - Python 명령어 처리: Argparse 모듈 (ArgumentParser 사용 예제)

[모바일 SW 개발/Python] - Python에서 사용자 입력 받는 방법: input()

[모바일 SW 개발/Android] - Android에서 Python 실행 (SL4A와 Termux 활용)

[모바일 SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[개발환경/Web Server] - Python: Web Framework Flask 사용하기

[모바일 SW 개발/Python] - Python code 숨기는 방법: PyInstaller로 실행 파일 만들기

[모바일 SW 개발/Python] - Python 여러 버전 설치 방법 (3.x and 3.y 동시 설치)

[모바일 SW 개발/Python] - Python 폴더 및 파일 처리 함수 모음

[모바일 SW 개발/Python] - Python: 폴더 백업 기능 구현 (7zip 압축, Sample code)

[모바일 SW 개발/Python] - Python 소스 숨기는 방법: pyc 활용 (Bytecode로 컴파일)

[모바일 SW 개발/Python] - Python 표준 입출력(stdin/stdout) 활용 - 리눅스 프로그램과 연동

[모바일 SW 개발/Python] - Python smtplib 사용한 email 발송 예제 (gmail)

 




댓글