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)
댓글