ZIP은 1989년에 등장한 가장 대표적인 무손실 압축(Lossless Compression-link) 포맷입니다. 이 글에서는 무손실 압축의 개념과 Python으로 ZIP 파일을 다루는 방법을 소개합니다.


ZIP 압축이란?

ZIP은 두 가지 주요 요소로 구성됩니다:

  1. 압축 포맷: 여러 개의 파일을 하나의 .zip 파일로 묶어 저장할 수 있는 구조
  2. 압축 알고리즘: 내부 데이터를 압축하여 저장 용량을 줄이는 방식

즉, 여러 파일을 하나로 묶으면서 동시에 용량도 줄여주는 효율적인 압축 기술입니다. 무엇보다 데이터 손실 없이 원본을 그대로 복원할 수 있어, 코드, 이미지, 문서 등 원본 보존이 중요한 파일에 적합합니다.


무손실 압축 vs 손실 압축

구분무손실 압축손실 압축
방식모든 데이터 유지일부 데이터 제거
용도문서, 코드, 원본 이미지사진, 음악, 영상 등
예시ZIP, PNG, FLACJPG, 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 모듈을 활용하면 다양한 자동화 작업이나 백업 시스템에서 충분히 강력한 도구가 될 수 있습니다.

압축은 데이터 보존과 효율성을 동시에 챙길 수 있는 필수 기술입니다.

By Mark

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다