Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python(lzma)을 사용한 LZMA 알고리즘을 사용한 압축

<시간/>

Lempel–Ziv–Markov 연쇄 알고리즘 (LZMA)는 다른 압축 알고리즘보다 높은 압축률을 특징으로 하는 사전 압축 방식을 사용하여 무손실 데이터 압축을 수행합니다. 파이썬의 lzma 모듈은 LZMA 알고리즘으로 데이터를 압축 및 압축해제하기 위한 클래스와 편의 함수로 구성되어 있습니다.

이 모듈의 기능은 bz2 모듈의 기능과 유사하지만 LZMAFile 클래스는 BZ2File 클래스에 비해 스레드로부터 안전하지 않습니다.

여기서도 lzma 모듈의 open() 함수는 lzma 압축 파일 객체를 여는 가장 쉬운 방법입니다.

열기()

이 함수는 LZMA 압축 파일을 열고 파일 객체를 반환합니다. 이 기능에는 파일 이름과 모드의 두 가지 주요 매개변수가 필요합니다. 모드 매개변수는 기본적으로 "rb"이지만 다음 값 중 하나를 사용할 수 있습니다.

이진 모드 - "r", "rb", "w", "wb", "x", "xb", "a" 또는 "ab"텍스트 모드 - "rt", "wt", "xt" ", 또는 "에"

압축()

이 함수는 LZMA 알고리즘을 사용하여 주어진 데이터를 압축하고 바이트 객체를 반환합니다. 이 함수는 선택적으로 컨테이너 형식을 결정하는 형식 인수를 가질 수 있습니다. 가능한 값은 FORMAT_XZ(기본값) 및 FORMAT_ALONE입니다.

압축 해제()

이 함수는 데이터의 압축을 풀고 압축되지 않은 바이트 개체를 반환합니다.

위의 기능은 다음 예제에서 사용됩니다. LZMA 압축 데이터를 파일에 쓰려면

>>> import lzma>>> data =b"Welcome to TutorialsPoint">>> f =lzma.open("test.xz","wb")>>>f.write(data)>>> f.close()

현재 작업 디렉토리에 'test.xz' 파일이 생성됩니다. 이 파일에서 압축되지 않은 데이터를 가져오려면 다음 코드를 사용하십시오.

>>> import lzma>>> f =lzma.open("test.xz","rb")>>> data =f.read()>>> datab'TutorialsPoint에 오신 것을 환영합니다'

lzma 모듈의 객체 지향 API를 사용하여 압축을 수행하려면 LZMAFile 클래스를 사용해야 합니다.

LZMA파일()

이것은 LZMAFile 클래스의 생성자입니다. 파일과 모드를 지정해야 합니다. 'w' 또는 'wb' 모드가 있는 객체는 write() 메서드를 사용할 수 있도록 합니다.

쓰기()

이 방법은 주어진 데이터를 압축하고 그 아래의 파일에 씁니다.

>>> data =b'TutorialsPoint에 오신 것을 환영합니다'>>>obj =lzma.LZMAFile("test.xz", mode="wb")>>>obj.write(data)>>>obj.close ()

mode='rb' 매개변수로 생성된 LZMAFile 객체의 read() 메소드에 의해 압축된 파일을 읽고 압축되지 않은 데이터를 불러옵니다.

읽기()

이 메서드는 압축된 파일에서 데이터를 읽고 압축되지 않은 데이터를 반환합니다.

>>>obj =lzma.LZMAFile("test.xz", mode="rb")>>> data=obj.read()>>> datab'TutorialsPoint에 오신 것을 환영합니다'

LZMA 알고리즘을 사용하면 이미 열려 있는 파일에도 압축된 데이터를 쓸 수 있습니다. 다음 예에서는 'test.txt'가 'wb' 모드에서 정상적으로 열리고(내장된 open() 함수를 사용하여) 일부 텍스트가 기록됩니다. 이후 동일한 파일을 사용하여 압축 데이터를 작성합니다.

>>> f =open("test.txt","wb")>>>f.write(b"Hello world")>>>fp =lzma.open(f,"wb")>>>fp.write(b"파이썬에 오신 것을 환영합니다")>>>f.write(b"감사합니다")>>>f.close()>>>fp.flush()>>>fp.close() 

위의 코드를 실행하면 현재 디렉토리에 'test.txt'가 나타납니다. 아래와 같이 압축 및 비압축 데이터가 혼합되어 있습니다.

Hello worldý7zXZ æÖ´F!t/å£감사합니다

bz2 모듈과 마찬가지로 lzma 모듈에도 증분 압축기 및 압축 해제 클래스가 있습니다.

LZMA압축기()

증분 압축기 개체를 반환하는 생성자입니다. 여러 청크를 개별적으로 압축하고 연결된 데이터를 파일에 기록할 수 있습니다.

압축()

이 메서드는 주어진 데이터를 압축하고 바이트 개체를 반환합니다.

플러시()

이 메서드는 버퍼를 비우고 바이트 개체를 반환합니다.

다음 예제는 증분 압축기 개체를 사용하여 목록 개체를 압축합니다.

>>>> data =[b'Hello World', b'How are you?', b'welcome to Python']>>> obj =lzma.LZMACompressor()>>> bindata =[]>>> for i in data:bindata.append(obj.compress(i))>>> bindata.append(obj.flush())>>> bindata[b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F \x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3', b'', b'', b"\x01\x00'Hello WorldHow are you? Python에 오신 것을 환영합니다\x00\xf5\ xc6\xc1d|\xf3\x8ey\x00\x01@(\xd4RJ\xe5\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ"]

위 코드는 원래 목록에 있는 각 항목의 압축된 바이트 표현 목록으로 bindata를 빌드합니다. LZMADecompressor를 사용하여 압축되지 않은 데이터를 검색하려면 개체, 다음 문 사용

>>> obj =lzma.LZMADecompressor()>>> binstr =b''.join(bindata)>>> obj.decompress(binstr)b'Hello World 안녕하십니까? Python에 오신 것을 환영합니다'

이 기사에서는 lzma 모듈의 클래스와 기능을 예제와 함께 설명했습니다.