ZIP은 1989년에 등장한 가장 대표적인 무손실 압축(Lossless Compression-link) 포맷입니다. 이 글에서는 무손실 압축의 개념과 Python으로 ZIP 파일을 다루는 방법을 소개합니다.
ZIP 압축이란?
ZIP은 두 가지 주요 요소로 구성됩니다:
- 압축 포맷: 여러 개의 파일을 하나의
.zip
파일로 묶어 저장할 수 있는 구조 - 압축 알고리즘: 내부 데이터를 압축하여 저장 용량을 줄이는 방식
즉, 여러 파일을 하나로 묶으면서 동시에 용량도 줄여주는 효율적인 압축 기술입니다. 무엇보다 데이터 손실 없이 원본을 그대로 복원할 수 있어, 코드, 이미지, 문서 등 원본 보존이 중요한 파일에 적합합니다.
무손실 압축 vs 손실 압축
구분 | 무손실 압축 | 손실 압축 |
---|---|---|
방식 | 모든 데이터 유지 | 일부 데이터 제거 |
용도 | 문서, 코드, 원본 이미지 | 사진, 음악, 영상 등 |
예시 | ZIP, PNG, FLAC | JPG, MP3, MP4 |
손실 압축은 사람이 인식하기 어려운 데이터를 제거하는 방식으로, 유튜브가 네트워크 상황에 따라 화질을 다르게 보여주는 것도 좋은 예입니다.
왜 ZIP 압축을 사용하는가?
개발을 하다 보면 ZIP을 자주 쓰진 않지만, 운영 스크립트나 백업 자동화 등에서 유용하게 사용할 수 있습니다. 특히 다음과 같은 작업에 적합합니다:
- 여러 파일을 하나로 묶기
- 이미지나 모델 파일을 압축하여 배포
- 코드, 로그 파일 등 보존이 필요한 데이터 저장
- 머신러닝 전처리 단계에서 압축 파일 해제
Python으로 ZIP 압축하기
Python에서는 내장 모듈인 zipfile
을 이용해 손쉽게 ZIP 압축 및 해제를 구현할 수 있습니다.
코드 예시
import os
import zipfile
# 단일 파일 압축
def file_zip(source, target):
f_zip = zipfile.ZipFile(source, 'w')
f_zip.write(target, compress_type=zipfile.ZIP_DEFLATED)
f_zip.close()
# 특정 확장자 전체 압축
def files_zip_all(source, filetype_target):
f_zip = zipfile.ZipFile(source, 'w')
base_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'tmp')
for folder, _, files in os.walk(base_dir):
for file in files:
if file.endswith(filetype_target):
full_path = os.path.join(folder, file)
rel_path = os.path.relpath(full_path, base_dir)
f_zip.write(full_path, rel_path, compress_type=zipfile.ZIP_DEFLATED)
f_zip.close()
# 단일 파일 압축 해제
def file_unzip(source, target):
f_zip = zipfile.ZipFile(source)
f_zip.extract(target, os.path.dirname(os.path.abspath(__file__)))
f_zip.close()
# 전체 압축 해제
def file_all_unzip(source):
f_zip = zipfile.ZipFile(source)
f_zip.extractall(os.path.dirname(os.path.abspath(__file__)))
f_zip.close()
# 예시 실행
if __name__ == "__main__":
file_zip('compress.zip', 'source.file')
file_unzip('compress.zip', 'source.file')
file_all_unzip('compress.zip')
os.remove('compress.zip')
실전에서의 경험
사실 위 코드는 기능적으로는 잘 동작하지만, 복잡해 보일 수 있습니다. 특히 files_zip_all()
은 폴더 내부까지 순회하며 특정 확장자만 압축하기 때문에 구조가 복잡하죠.
Linux 기반에서는 zip
이나 unzip
명령어로 훨씬 간단하게 처리할 수 있습니다.
20년 넘게 프로그래밍을 해왔지만 여전히 변하지 않은 생각은 “프로그래머는 언어를 가리지 않는다.” 입니다.
Windows 환경에선 위 Python 코드를 쓸 수 있고, Linux라면 간단한 Shell 명령어로 충분하겠죠.
⚙️ 최근 무손실 압축 기술의 경향
2025년 현재, ZIP 외에도 다양한 무손실 압축 알고리즘이 존재합니다. 예를 들어:
- 7z: 높은 압축률
- gzip: 빠른 속도와 간결함
- Zstandard: 압축 속도와 해제 속도의 균형
하지만 일반적인 상황에서 차이는 미미한 경우도 많습니다. 중요 데이터는 압축률보다는 데이터의 안전성과 접근성이 더 중요하죠.
마무리
ZIP은 여전히 유용하고 직관적인 무손실 압축 포맷입니다. Python의 zipfile
모듈을 활용하면 다양한 자동화 작업이나 백업 시스템에서 충분히 강력한 도구가 될 수 있습니다.
압축은 데이터 보존과 효율성을 동시에 챙길 수 있는 필수 기술입니다.