gzip — gzip 파일 지원
gzip — gzip 파일 지원
gzip 모듈은 GNU 프로그램 gzip과 gunzip이 하는 것처럼 파일을 압축하고 푸는 간단한 인터페이스를 제공해요.
참고: 이 모듈은 선택적(optional) 모듈이에요. CPython 배포본에 없다면 배포자(즉 Python을 제공한 사람)의 문서를 찾아보세요. 배포자라면 선택적 모듈에 대한 요구사항을 참고하세요.
데이터 압축은 zlib 모듈이 제공합니다. gzip 모듈은 GzipFile 클래스와 open(), compress(), decompress() 편의 함수를 제공해요. GzipFile 클래스는 gzip 형식 파일을 읽고 쓰며, 데이터가 보통 파일 객체처럼 보이도록 자동으로 압축·해제해 줍니다.
gzip과 gunzip 프로그램이 해제할 수 있는 다른 파일 형식들(예: compress와 pack이 만든 것)은 이 모듈이 지원하지 않는다는 점을 기억하세요.
출처: Python 표준 라이브러리
open()
gzip.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)
gzip 압축 파일을 바이너리 또는 텍스트 모드로 열고 파일 객체를 반환해요.
filename 인자는 실제 파일명(str 또는 bytes 객체)이거나, 읽거나 쓸 기존 파일 객체일 수 있습니다.
mode 인자는 바이너리 모드의 경우 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', 'xb' 중 하나, 텍스트 모드의 경우 'rt', 'at', 'wt', 'xt' 중 하나가 될 수 있어요. 기본값은 'rb'입니다.
compresslevel 인자는 GzipFile 생성자에서처럼 0~9 사이의 정수예요.
바이너리 모드에서 이 함수는 GzipFile 생성자(GzipFile(filename, mode, compresslevel))와 동일합니다. 이 경우 encoding, errors, newline 인자를 제공하면 안 돼요.
텍스트 모드에서는 GzipFile 객체가 만들어지고, 지정된 인코딩·오류 처리 동작·줄바꿈과 함께 io.TextIOWrapper 인스턴스로 감싸집니다.
버전 3.3에서 변경: filename이 파일 객체가 되는 지원, 텍스트 모드 지원, encoding, errors, newline 인자 추가. 버전 3.4에서 변경: 'x', 'xb', 'xt' 모드 지원. 버전 3.6에서 변경: path-like 객체 허용.
BadGzipFile
exception gzip.BadGzipFile
잘못된 gzip 파일에 대해 발생하는 예외예요. OSError에서 상속받아요. 잘못된 gzip 파일에는 EOFError와 zlib.error도 발생할 수 있습니다. 버전 3.8에서 추가됨.
GzipFile
class gzip.GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)
GzipFile 클래스의 생성자로, 파일 객체의 대부분의 메서드를 truncate() 메서드만 빼고 시뮬레이션합니다. fileobj와 filename 중 적어도 하나는 유의미한 값이 주어져야 해요.
새 클래스 인스턴스는 fileobj를 기반으로 하는데, 이는 보통 파일, io.BytesIO 객체, 또는 파일을 시뮬레이션하는 다른 어떤 객체일 수 있어요. 기본값은 None이며, 이 경우 filename을 열어 파일 객체를 제공합니다.
fileobj가 None이 아닐 때, filename 인자는 gzip 파일 헤더에 포함되기 위해서만 사용되며, 거기에는 압축되지 않은 파일의 원래 파일명이 포함될 수 있어요. 기본값은 식별할 수 있으면 fileobj의 파일명이고, 그렇지 않으면 빈 문자열이며, 이 경우 원래 파일명은 헤더에 포함되지 않습니다.
mode 인자는 파일을 읽을지 쓸지에 따라 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', 'xb' 중 하나가 될 수 있어요. 기본값은 식별할 수 있으면 fileobj의 모드이고, 그렇지 않으면 'rb'입니다. 미래의 Python 릴리스에서는 fileobj의 모드를 사용하지 않을 거예요. 쓰기에는 항상 mode를 지정하는 게 좋습니다.
파일은 항상 바이너리 모드로 열린다는 점을 기억하세요. 텍스트 모드로 압축 파일을 열려면 open()을 쓰거나(또는 GzipFile을 io.TextIOWrapper로 감싸세요).
compresslevel 인자는 압축 수준을 제어하는 0~9 사이의 정수예요; 1이 가장 빠르고 압축률이 가장 낮으며, 9가 가장 느리고 압축률이 가장 높습니다. 0은 압축하지 않음이에요. 기본값은 9입니다.
선택적 mtime 인자는 gzip이 요청하는 타임스탬프예요. 시간은 Unix 형식, 즉 1970년 1월 1일 00:00:00 UTC 이후 초 단위입니다. mtime을 생략하거나 None으로 하면 현재 시간이 사용됩니다. 생성 시간에 의존하지 않는 압축 스트림을 만들려면 mtime = 0을 쓰세요. (해제 시 설정되는 mtime 속성에 대해서는 아래를 참고하세요.)
GzipFile 객체의 close() 메서드는 fileobj를 닫지 않아요. 압축 데이터 뒤에 더 많은 내용을 추가하고 싶을 수도 있기 때문입니다. 이는 또한 쓰기용으로 열린 io.BytesIO 객체를 fileobj로 전달하고, 그 io.BytesIO 객체의 getvalue() 메서드로 결과 메모리 버퍼를 가져올 수 있게 해 줍니다.
GzipFile은 이터레이션과 with 문을 포함한 io.BufferedIOBase 인터페이스를 지원해요. truncate() 메서드만 구현되지 않았습니다.
GzipFile은 다음 메서드와 속성도 제공해요:
peek()
peek(n)
파일 위치를 전진시키지 않고 압축 해제된 n 바이트를 읽어요. 반환되는 바이트 수는 요청한 것보다 많거나 적을 수 있습니다.
참고:
peek()을 호출해도GzipFile의 파일 위치는 바뀌지 않지만, 기본 파일 객체의 위치는 바뀔 수 있어요(예:GzipFile이fileobj매개변수로 구성된 경우).
버전 3.2에서 추가됨.
mode 속성
'rb' — 읽기용, 'wb' — 쓰기용. 버전 3.13에서 변경: 이전 버전에서는 정수 1 또는 2였어요.
mtime 속성
해제할 때 이 속성은 가장 최근에 읽은 헤더의 마지막 타임스탬프로 설정됩니다. Unix epoch(1970년 1월 1일 00:00:00 UTC) 이후 초 수를 담은 정수예요. 헤더를 읽기 전의 초기 값은 None입니다.
name 속성
디스크에 있는 gzip 파일의 경로로, str 또는 bytes. 원래 입력 경로에 os.fspath()를 적용한 출력과 동일하며 다른 정규화·해석·확장은 없어요.
버전 3.1에서 변경: with 문 지원이 mtime 생성자 인자와 mtime 속성과 함께 추가됨. 버전 3.2에서 변경: 0으로 패딩된·비탐색(seek) 불가 파일 지원. 버전 3.3에서 변경: io.BufferedIOBase.read1() 메서드가 구현됨. 버전 3.4에서 변경: 'x', 'xb' 모드 지원. 버전 3.5에서 변경: 임의의 bytes류 객체 쓰기 지원. read() 메서드가 None 인자 허용. 버전 3.6에서 변경: path-like 객체 허용. 버전 3.9부터 폐기: 쓰기용 GzipFile을 mode 인자 지정 없이 여는 것. 버전 3.12에서 변경: filename 속성 제거, 대신 name 속성 사용.
compress()
gzip.compress(data, compresslevel=9, *, mtime=0)
data를 압축하고, 압축된 데이터를 담은 bytes 객체를 반환해요. compresslevel과 mtime은 위 GzipFile 생성자에서와 같은 의미지만, 재현 가능한 출력을 위해 mtime은 기본값이 0입니다.
버전 3.2에서 추가됨. 버전 3.8에서 변경: 재현 가능한 출력을 위한 mtime 매개변수 추가. 버전 3.11에서 변경: 스트리밍 방식 대신 모든 데이터를 한 번에 압축해 속도 향상. mtime이 0으로 설정된 호출은 더 나은 속도를 위해 zlib.compress()에 위임돼요. 이 상황에서 출력은 기본 zlib 구현이 제공하는 것 외에 255 "unknown"이 아닌 gzip 헤더 "OS" 바이트 값을 담을 수 있습니다. 버전 3.13에서 변경: 이 함수를 사용할 때 gzip 헤더 OS 바이트가 3.10 이하에서와 같이 255로 설정됨이 보장됩니다. 버전 3.14에서 변경: 재현 가능한 출력을 위해 mtime 매개변수 기본값이 이제 0. 이전의 현재 시간 사용 동작을 원하면 mtime에 None을 전달하세요.
decompress()
gzip.decompress(data)
data를 해제하고, 압축되지 않은 데이터를 담은 bytes 객체를 반환해요. 이 함수는 다중 멤버 gzip 데이터(함께 연결된 여러 gzip 블록)를 해제할 수 있습니다. 데이터가 확실히 멤버 하나만 담고 있을 때는 wbits를 31로 설정한 zlib.decompress()가 더 빠릅니다.
버전 3.2에서 추가됨. 버전 3.11에서 변경: 스트리밍 방식 대신 멤버를 메모리에서 한 번에 해제해 속도 향상.
사용 예
압축 파일을 읽는 예:
import gzip
with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
file_content = f.read()
압축된 GZIP 파일을 만드는 예:
import gzip
content = b"Lots of content here"
with gzip.open('/home/joe/file.txt.gz', 'wb') as f:
f.write(content)
기존 파일을 GZIP 압축하는 예:
import gzip
import shutil
with open('/home/joe/file.txt', 'rb') as f_in:
with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
바이너리 문자열을 GZIP 압축하는 예:
import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)
함께 보기:
zlib모듈 — gzip 파일 형식을 지원하는 데 필요한 기본 데이터 압축 모듈. gzip (해)압축이 병목이라면 python-isal 패키지가 대부분 호환되는 API로 (해)압축을 빠르게 해 줍니다.
명령줄 인터페이스
gzip 모듈은 파일을 압축하거나 푸는 간단한 명령줄 인터페이스를 제공해요. 실행 후 gzip 모듈은 입력 파일(들)을 유지합니다.
버전 3.8에서 변경: 사용법이 있는 새 명령줄 인터페이스 추가. 기본적으로 CLI를 실행하면 기본 압축 수준은 6이에요.
명령줄 옵션
file— 지정되지 않으면sys.stdin에서 읽어요.--fast— 가장 빠른 압축 방법을 나타냄(압축률 낮음).--best— 가장 느린 압축 방법을 나타냄(압축률 최고).-d, --decompress— 주어진 파일을 해제해요.-h, --help— 도움말 메시지를 보여줘요.
더 알아보기
- Python 표준 라이브러리의
zlib,bz2모듈 - Python 공식 문서: gzip