py7zr
python의 7z을 사용할 수 있는 패키지 입니다.
압축 해제가 예제들은 많이 있는데 멀티 볼륨에 대한 압축 방법 설명이 미흡해서 찾아봤습니다.
예제
import py7zr # pip install py7zr
import multivolumefile # pip install multivolumefile
import random
import os
# https://py7zr.readthedocs.io/en/latest/user_guide.html
# https://py7zr.readthedocs.io/en/latest/api.html
def make_random_file(file_name,file_size):
f = open(file_name, "wb")
for i in range(int(file_size/2)):
random_v = random.random()
random_v = (random_v * 65536) % 65536
random_v = int(random_v)
f.write(random_v.to_bytes(2, 'big'))
f.close()
orifile = "test.bin" # 압축 하려고 하는 파일
outfile = "out/output1.7z" # 압축된 결과 파일
try:
os.mkdir("out")
except:
pass
# 임시 파일
make_random_file(orifile,3*1024)
filters=[{'id':py7zr.FILTER_COPY}]
'''
LZMA2 + Delta
[{'id': FILTER_DELTA}, {'id': FILTER_LZMA2, 'preset': PRESET_DEFAULT}]
LZMA2 + BCJ
[{'id': FILTER_X86}, {'id': FILTER_LZMA2, 'preset': PRESET_DEFAULT}]
LZMA2 + ARM
[{'id': FILTER_ARM}, {'id': FILTER_LZMA2, 'preset': PRESET_DEFAULT}]
LZMA + BCJ
[{'id': FILTER_X86}, {'id': FILTER_LZMA}]
LZMA2
[{'id': FILTER_LZMA2, 'preset': PRESET_DEFAULT}]
LZMA
[{'id': FILTER_LZMA}]
BZip2
[{'id': FILTER_BZIP2}]
Deflate
[{'id': FILTER_DEFLATE}]
ZStandard
[{'id': FILTER_ZSTD, 'level': 3}]
PPMd
[{'id': FILTER_PPMD, 'order': 6, 'mem': 24}]
[{'id': FILTER_PPMD, 'order': 6, 'mem': "16m"}]
Brolti
[{'id': FILTER_BROTLI, 'level': 11}]
7zAES + LZMA2 + Delta
[{'id': FILTER_DELTA}, {'id': FILTER_LZMA2, 'preset': PRESET_DEFAULT}, {'id': FILTER_CRYPTO_AES256_SHA256}]
7zAES + LZMA2 + BCJ
[{'id': FILTER_X86}, {'id': FILTER_LZMA2, 'preset': PRESET_DEFAULT}, {'id': FILTER_CRYPTO_AES256_SHA256}]
7zAES + LZMA
[{'id': FILTER_LZMA}, {'id': FILTER_CRYPTO_AES256_SHA256}]
7zAES + Deflate
[{'id': FILTER_DEFLATE}, {'id': FILTER_CRYPTO_AES256_SHA256}]
7zAES + BZip2
[{'id': FILTER_BZIP2}, {'id': FILTER_CRYPTO_AES256_SHA256}]
7zAES + ZStandard
[{'id': FILTER_ZSTD}, {'id': FILTER_CRYPTO_AES256_SHA256}]
'''
# 분할 압축
with multivolumefile.open(outfile, mode='wb', volume=1023) as target_archive:
with py7zr.SevenZipFile(target_archive, 'w', filters=filters) as archive:
archive.writeall(orifile)
for fileinfo in target_archive._fileinfo:
print(fileinfo.filename) # 압축한 파일 이름을 알 수 있음
outfile = "out/output2.7z" # 압축된 결과 파일
# 분할 압축
with multivolumefile.open(outfile, mode='wb', volume=1023) as target_archive:
with py7zr.SevenZipFile(target_archive, 'w') as archive:
archive.writeall(orifile)
for fileinfo in target_archive._fileinfo:
print(fileinfo.filename) # 압축한 파일 이름을 알 수 있음
예제 설명
임시 파일을 만들고 멀티 볼륨으로 압축하는 예제입니다. 여기에서는 알고리즘 선택을 압축 안함과 기본값으로 하는 두가지 예제입니다.
압축 안함의 경우 filters 값을 COPY로 설정하면 됩니다.
filters=[{'id':py7zr.FILTER_COPY}]
filters 인자를 넘기지 않으면 기본값 상태로 압축을 하게됩니다.
일부 코드 에서는 volume_size로 입력하는곳이 있는데 에러가 발생합니다. volume을 사용해주세요
실행결과
out\output1.7z.0001
out\output1.7z.0002
out\output1.7z.0003
out\output1.7z.0004
out\output2.7z.0001
out\output2.7z.0002
out\output2.7z.0003
out\output2.7z.0004