GZip은 파일을 압축하고 해제하는 데 사용되는 대표적인 압축 도구로, GNU 프로젝트의 일부입니다. 파이썬(Python)의 gzip 모듈은 이 GZip 프로그램에 접근할 수 있는 인터페이스 역할을 하며, gzip 데이터 압축 알고리즘 자체는 zlib 모듈을 기반으로 동작합니다.
gzip 모듈에는 GzipFile 클래스와 그 메서드들이 정의되어 있고, 편의 함수인 open(), compress(), decompress()도 함께 제공됩니다. 가장 간단하게 압축과 해제를 수행하는 방법은 바로 이 편의 함수들을 활용하는 것입니다.
open() 함수
open() 함수는 gzip으로 압축된 파일을 바이너리 또는 텍스트 모드로 열어 파일 객체(file-like object)를 반환합니다. 반환되는 객체는 실제 파일일 수도 있고, 문자열이나 바이트 객체일 수도 있습니다.
기본값은 'rb' 모드(바이너리 데이터 읽기)이지만, mode 매개변수를 통해 아래와 같은 다양한 모드를 지정할 수 있습니다.
바이너리 모드 : 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', 'xb'
텍스트 모드 : 'rt', 'at', 'wt', 'xt'
또한 이 함수는 압축 레벨(compresslevel)을 지정할 수 있으며, 허용 범위는 0부터 9까지입니다. 파일을 텍스트 모드로 열 경우 GzipFile 객체가 TextIOWrapper 객체로 감싸진다는 점도 참고하세요.
compress() 함수
compress() 함수는 인자로 전달받은 데이터를 압축하여 압축된 바이트 객체를 반환합니다. 기본 압축 레벨은 9(최대 압축률)입니다.
decompress() 함수
decompress() 함수는 압축된 바이트 객체를 입력받아 해제하고, 원본 데이터를 반환합니다.
gzip 파일 생성하기
다음 예제는 압축된 데이터를 작성하여 gzip 파일을 만드는 코드입니다.
>>> import gzip
>>> data = b'Python - Batteries included'
>>> with gzip.open("test.txt.gz", "wb") as f:
f.write(data)
이 코드를 실행하면 현재 디렉터리에 "test.txt.gz" 파일이 생성됩니다. 이 gzip 아카이브 안에는 "test.txt"가 포함되어 있으며, 압축 해제 유틸리티를 사용하면 직접 확인할 수 있습니다.
압축 파일 읽기
생성한 압축 파일을 프로그래밍 방식으로 읽으려면 다음과 같이 작성합니다.
>>> with gzip.open("test.txt.gz", "rb") as f:
data = f.read()
>>> data
b'Python - Batteries included'기존 파일을 gzip 아카이브로 압축하기
기존 파일을 gzip 아카이브로 압축하려면 파일 내용을 읽어 bytearray로 변환한 뒤, 이를 gzip 파일에 쓰면 됩니다. 아래 예제에서는 현재 디렉터리에 'zen.txt' 파일이 있다고 가정합니다.
fp = open("zen.txt","rb")
>>> data = fp.read()
>>> bindata = bytearray(data)
>>> with gzip.open("zen.txt.gz", "wb") as f:
f.write(bindata)gzip 아카이브에서 원본 파일 복원하기
gzip 아카이브에 저장된 데이터를 꺼내 원본 파일로 복원하는 방법은 다음과 같습니다.
>>> fp = open("zen1.txt", "wb")
>>> with gzip.open("zen.txt.gz", "rb") as f:
bindata = f.read()
>>> fp.write(bindata)
>>> fp.close()위 코드를 실행하면 현재 디렉터리에 'zen1.txt'가 생성되며, 그 내용은 'zen.txt'와 동일합니다.
GzipFile 클래스 활용하기
편의 함수 외에도 gzip 모듈에는 GzipFile 클래스가 포함되어 있어 더 세밀한 제어가 가능합니다. 이 클래스의 생성자는 file, mode, compresslevel 인자를 받으며, 각 인자의 의미는 앞서 설명한 open() 함수와 동일합니다.
GzipFile로 데이터 쓰기
mode 매개변수를 'w', 'wb' 또는 'wt'로 지정하면 GzipFile 객체의 write() 메서드를 통해 전달된 데이터를 압축하여 gzip 파일에 기록할 수 있습니다.
>>> f = gzip.GzipFile("testnew.txt.gz","wb")
>>> data = b'Python - Batteries included'
>>> f.write(data)
>>> f.close()이 코드는 testnew.txt.gz 파일을 생성합니다. 압축 해제 유틸리티로 열어보면 'Python – Batteries included'라는 텍스트가 담긴 testnew.txt가 들어 있는 것을 확인할 수 있습니다.
GzipFile로 데이터 읽기
GzipFile 객체로 gzip 파일을 해제하려면 mode 매개변수를 'rb'로 지정해 객체를 생성한 후, read() 메서드로 압축 해제된 데이터를 읽으면 됩니다.
>>> f = gzip.GzipFile("testnew.txt.gz","rb")
>>> data = f.read()
>>> data
b'Python - Batteries included'마무리
지금까지 파이썬의 gzip 모듈을 활용해 파일을 압축하고 해제하는 다양한 방법을 살펴보았습니다. 간단한 작업에는 open(), compress(), decompress() 같은 편의 함수를, 더 세밀한 제어가 필요한 경우에는 GzipFile 클래스를 활용하면 됩니다. 이를 응용하면 로그 파일 압축, 백업 자동화 등 실무에서 유용하게 활용할 수 있습니다.