gzip — gzip 파일 지원
gzip — gzip 파일 지원
gzip 모듈은 GNU 프로그램 gzip과 gunzip처럼 파일을 압축·해제하는 간단한 인터페이스를 제공해요. 데이터 압축은 zlib 모듈이 담당해요. gzip 모듈은 GzipFile 클래스와 함께 open(), compress(), decompress() 편의 함수를 제공하며, GzipFile 클래스는 gzip 형식 파일을 읽고 쓰면서 데이터를 자동으로 압축·해제하여 일반 파일 객체처럼 보이게 해요.
gzip과 gunzip 프로그램이 해제할 수 있는 추가 파일 형식(예: compress와 pack이 만든 것)은 이 모듈에서 지원되지 않아요.
본문
함수와 예외
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 객체를 만들고 지정된 encoding, 오류 처리 동작, 줄 끝으로 io.TextIOWrapper 인스턴스로 감싸요.
exception gzip.BadGzipFile — 유효하지 않은 gzip 파일에 대해 발생하는 예외예요. OSError를 상속해요. 유효하지 않은 gzip 파일에 대해 EOFError와 zlib.error도 발생할 수 있어요. 버전 3.8에서 추가됨.
class gzip.GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None) — 파일 객체의 대부분의 메서드를(단, truncate() 메서드 제외) 시뮬레이션하는 GzipFile 클래스의 생성자예요. fileobj와 filename 중 적어도 하나는 비트리비얼한 값을 가져야 해요.
새 클래스 인스턴스는 fileobj에 기반하는데, 이는 일반 파일, io.BytesIO 객체, 또는 파일을 시뮬레이션하는 다른 객체일 수 있어요. 기본값은 None이며, 이 경우 filename이 열려 파일 객체를 제공해요. fileobj가 None이 아니면 filename 인자는 gzip 파일 헤더에 포함되기 위해서만 사용되며, 헤더에는 압축 전 원본 파일의 원래 파일명이 포함될 수 있어요.
mode는 파일을 읽을지 쓸지에 따라 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', 'xb' 중 하나예요. 기본값은 discernible한 경우 fileobj의 모드이고, 그렇지 않으면 'rb'예요. 파일은 항상 바이너리 모드로 열린다는 점에 유의하세요.
compresslevel은 0~9의 정수로 압축 수준을 제어하며, 1이 가장 빠르고 압축이 가장 적고, 9가 가장 느리고 압축이 가장 많아요. 0은 압축 없음이에요. 기본값은 9예요.
선택적 mtime 인자는 gzip이 요청하는 타임스탬프로, Unix 형식(1970년 1월 1일 00:00:00 UTC 이후의 초)이에요. 생략하거나 None이면 현재 시간이 사용돼요. mtime = 0을 사용하면 생성 시간에 의존하지 않는 압축 스트림을 만들 수 있어요.
GzipFile 객체의 close() 메서드 호출은 fileobj를 닫지 않아요. GzipFile은 반복 및 with 문을 포함한 io.BufferedIOBase 인터페이스를 지원하고, truncate() 메서드만 구현되지 않았어요.
peek(n) — 파일 위치를 진행하지 않고 압축 해제된 바이트 n개를 읽어요. 반환되는 바이트 수는 요청한 것보다 많거나 적을 수 있어요. 버전 3.2에서 추가됨.
mode — 읽기용 'rb', 쓰기용 'wb'. 버전 3.13에서 변경: 이전 버전에서는 정수 1 또는 2였어요.
mtime — 해제할 때 이 속성은 가장 최근에 읽은 헤더의 마지막 타임스탬프로 설정돼요. Unix epoch(1970년 1월 1일 00:00:00 UTC) 이후 초를 담은 정수예요. 헤더를 읽기 전 초기값은 None이에요.
gzip.compress(data, compresslevel=9, *, mtime=0) — data를 압축해 압축된 데이터를 담은 bytes 객체를 반환해요. compresslevel과 mtime은 GzipFile 생성자와 같은 의미지만, 반복 가능한 출력을 위해 mtime 기본값은 0이에요.
gzip.decompress(data) — data를 해제해 압축 해제된 데이터를 담은 bytes 객체를 반환해요. 이 함수는 여러 멤버로 구성된 gzip 데이터(여러 gzip 블록을 연결한 것)를 해제할 수 있어요. 데이터가 확실히 단일 멤버만 포함한다면 zlib.decompress()를 wbits 31로 사용하는 것이 더 빨라요.
사용 예시
압축 파일 읽기:
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)
명령줄 인터페이스
gzip 모듈은 파일을 압축·해제하는 간단한 명령줄 인터페이스를 제공해요. 실행되면 gzip 모듈은 입력 파일을 유지해요. 기본 압축 수준은 6이에요.
file— 지정하지 않으면sys.stdin에서 읽음.--fast— 가장 빠른 압축 방법(압축 적음).--best— 가장 느린 압축 방법(최고 압축).-d, --decompress— 주어진 파일 해제.-h, --help— 도움말 표시.
참고
- 모듈
zlib— gzip 파일 형식을 지원하기 위해 필요한 기본 데이터 압축 모듈.