bzip2는 파일 압축 및 해제를 위한 대표적인 오픈 소스 알고리즘입니다. 파이썬에서는 표준 라이브러리인 bz2 모듈을 통해 이 알고리즘을 코드로 간편하게 구현할 수 있습니다.
bz2 모듈의 기본 인터페이스는 open() 함수이며, 그 외에도 BZ2File, BZ2Compressor, BZ2Decompressor 클래스를 제공합니다. 아래 예제를 실행하려면 먼저 import bz2로 모듈을 불러와야 합니다.
open() 함수
open() 함수는 bzip2로 압축된 파일을 열고 파일 객체를 반환합니다. 파일은 읽기/쓰기 권한과 함께 바이너리 모드 또는 텍스트 모드로 열 수 있으며, compressionlevel 인자(1~9)에 따라 압축 수준이 결정됩니다.
write()와 read()
파일을 'w' 또는 'wb' 모드로 열면 파일 객체에서 write() 메서드를 사용할 수 있습니다. 바이너리 모드에서는 압축된 바이너리 데이터가 파일에 직접 기록되고, 일반 텍스트 모드에서는 파일 객체가 TextIOWrapper로 감싸져 인코딩이 자동으로 처리됩니다.
반대로 읽기 모드('r' 또는 'rb')로 열면 read() 메서드가 파일 내용을 읽어 압축 해제된 데이터를 반환합니다.
다음 코드는 문자열 데이터를 bzip2 파일로 압축해 저장하는 예입니다.
>>> f = bz2.open("test.bz2", "wb")
>>> data = b'Welcome to TutorialsPoint'
>>> f.write(data)
>>> f.close()
이 코드를 실행하면 현재 디렉터리에 test.bz2 파일이 생성됩니다. 압축 해제 도구로 이 파일을 열면 그 안에 'test'라는 원본 파일이 들어 있는 것을 확인할 수 있습니다. 저장된 데이터를 다시 읽어오려면 아래 코드를 사용합니다.
>>> f = bz2.open("test.bz2", "rb")
>>> data = f.read()
>>> data
b'Welcome to TutorialsPoint'
BZ2File 클래스
bz2 모듈은 BZ2File 클래스도 정의하고 있습니다. 생성자에 전달하는 mode 매개변수에 따라 객체가 압축기 또는 압축 해제기 역할을 수행합니다. file과 mode 매개변수는 필수이며, compressionlevel의 기본값은 9이고 1~9 사이의 값으로 지정할 수 있습니다.
BZ2Compressor() — 점진적 압축
BZ2Compressor()는 증분(incremental) 압축기 객체를 반환합니다. 이 클래스의 compress() 메서드를 호출할 때마다 압축된 데이터 조각(chunk)이 반환되며, 여러 조각을 이어 붙여 최종적으로 bzip2 압축 파일에 기록할 수 있습니다.
flush() 메서드
flush() 메서드는 내부 버퍼를 비우고 남아 있던 데이터 조각을 반환합니다. 이 반환값은 반드시 압축된 데이터의 끝부분에 덧붙여야 온전한 압축 결과가 됩니다.
BZ2Decompressor() — 점진적 압축 해제
BZ2Decompressor()는 증분 압축 해제기 객체를 반환합니다. 각 단계에서 반환된 압축 해제 데이터 조각들을 flush된 데이터와 함께 순서대로 이어 붙이면 원본(압축되지 않은) 데이터를 얻을 수 있습니다.
다음 예제는 리스트의 각 항목을 순차적으로 압축한 뒤, 이어 붙인 바이트 객체를 파일에 저장하고, BZ2Decompressor 객체로 원본 데이터를 복원하는 전체 과정을 보여줍니다.
>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = bz2.BZ2Compressor()
>>> f = bz2.open("test.bz2", "wb")
>>> d1 = obj.compress(data[0])
>>> d2 = obj.compress(data[1])
>>> d3 = obj.compress(data[2])
>>> d4 = obj.flush()
>>> compressedobj = d1 + d2 + d3 + d4
>>> f.write(compressedobj)
>>> f.close()
>>> obj = bz2.BZ2Decompressor()
>>> f = bz2.open("test.bz2", "rb")
>>> data = f.read()
>>> obj.decompress(data)
b'Hello WorldHow are you?welcome to Python'
이처럼 bz2 모듈을 활용하면 간단한 파일 입출력부터 스트림 단위의 점진적 압축·해제까지 유연하게 처리할 수 있어, 대용량 로그 파일이나 백업 데이터를 다룰 때 특히 유용합니다.