Python의 zlib 모듈은 데이터 압축 분야의 사실상 표준인 zlib 압축 라이브러리(https://www.zlib.net)를 파이썬에서 간편하게 사용할 수 있도록 제공하는 인터페이스입니다. 리눅스·유닉스 환경에서 널리 쓰이는 gzip 역시 내부적으로 zlib과 동일한 DEFLATE 알고리즘을 사용하기 때문에, 이 모듈을 활용하면 gzip 형식과 호환되는 압축 데이터를 손쉽게 다룰 수 있습니다.
이 글에서는 zlib 모듈의 핵심 함수와 클래스를 예제 코드와 함께 살펴보겠습니다.
compress() – 데이터 압축하기
compress() 함수는 decompress() 함수와 함께 이 모듈의 기본 인터페이스입니다. 인자로 전달된 데이터를 압축하여 바이트 객체(byte object)를 반환합니다.
두 번째 매개변수인 level은 압축 강도를 조절하는 값으로 0~9 사이의 정수를 지정할 수 있습니다. 0은 압축하지 않음(no compression)을, 9는 최대 압축(best compression)을 의미합니다. 압축 수준이 높아질수록 결과 데이터의 크기는 작아지지만, 그만큼 처리 시간이 더 소요될 수 있다는 점을 고려해야 합니다.
decompress() – 원본 데이터 복원하기
decompress() 함수는 compress()의 반대 작업을 수행하여 압축 해제된 원본 데이터를 돌려줍니다. 선택적 매개변수인 wbits를 통해 히스토리 버퍼의 크기와 헤더·트레일러 포맷의 종류를 지정할 수 있습니다. 이 값을 조정하면 gzip 같은 다른 컨테이너 형식과의 호환성도 확보할 수 있습니다.
다음은 compress() 함수로 문자열 객체를 압축하는 예제입니다.
>>> import zlib >>> c = zlib.compress(b'hello python') >>> c b'x\x9c\xcbH\xcd\xc9\xc9W(\xa8,\xc9\xc8\xcf\x03\x00\x1e\xf0\x04\xd7'
반대로 decompress() 함수를 호출하면 원래 문자열을 그대로 되돌려받습니다.
>>> zlib.decompress(c) b'hello python'
스트림 처리를 위한 클래스
zlib 모듈에는 대용량 데이터를 스트림 단위로 처리할 수 있도록 압축·압축 해제 전용 클래스 두 개가 마련되어 있습니다.
compressobj() – 압축 객체
compressobj() 생성자는 데이터 스트림을 압축하는 데 사용되는 압축 객체(compression object)를 반환합니다. 주요 메서드는 다음과 같습니다.
- compress() – 전달된 데이터를 압축한 바이트 객체를 반환합니다.
- flush() – 압축 객체는 스트림을 다루기 때문에 일부 압축 데이터가 버퍼에 남아 있을 수 있습니다. 이 메서드는 버퍼를 비워 최종 압축 결과를 완성합니다.
다음 예제는 압축 객체를 생성한 뒤, compress() 메서드의 반환값에 flush() 결과를 더해 하나의 완전한 압축 데이터를 만드는 과정을 보여줍니다.
>>> s1 = b'hello python' >>> c = zlib.compressobj() >>> s2 = c.compress(s1) >>> s2 = s2+c.flush() >>> s2 b'x\x9c\xcbH\xcd\xc9\xc9W(\xa8,\xc9\xc8\xcf\x03\x00\x1e\xf0\x04\xd7'
decompressobj() – 압축 해제 객체
decompressobj()는 스트림으로 들어오는 대용량 데이터를 점진적으로 압축 해제하는 객체를 생성하는 생성자입니다. 제공되는 메서드는 다음과 같습니다.
- decompress() – 압축 해제된 데이터를 반환합니다.
- flush() – 버퍼에 남아 있는 데이터를 비워 나머지 결과를 반환합니다.
앞선 예제에서 만든 바이트 객체에서 원본 데이터를 복원하는 코드는 아래와 같습니다.
>>> d = zlib.decompressobj() >>> x = d.decompress(s2) >>> x = x+d.flush() >>> x b'hello python'
gzip 형식과 호환하기
gzip과 완전히 호환되는 데이터를 만들거나 읽어야 한다면 wbits 인자를 활용하면 됩니다. 예를 들어 compressobj(wbits=zlib.MAX_WBITS | 16)처럼 지정하면 gzip 헤더와 트레일러가 포함된 형식으로 압축되며, decompress(data, wbits=zlib.MAX_WBITS | 16)를 사용하면 gzip 파일 데이터도 그대로 해제할 수 있습니다.
버전 정보 확인용 상수
zlib 모듈은 사용 중인 zlib 라이브러리의 버전 정보를 담은 두 개의 상수를 제공합니다.
>>> zlib.ZLIB_VERSION '1.2.11' >>> zlib.ZLIB_RUNTIME_VERSION '1.2.11'