2022년 9월 17일 토요일

py7zr multi volume(python 7z 멀티 볼륨(분할) 압축 사용) 2탄

 

7z 멀티 볼륨 처리하는 부분 업데이트를 했습니다.

기존 글은 아래 링크로 읽어주시기 바랍니다. 

https://swlock.blogspot.com/2022/06/py7zr-multi-volumepython-7z.html


압축 파일의 파일 경로 포함됨

기존 예제의 문제점 압축 파일에 경로명까지 포함되는 문제가 있습니다.

압축을 풀게되면 경로가 복잡한 경우 복잡한 경로 아래에 풀리게 됩니다.

# 기본 압축 : 경로 저장 안함
outfile = "out/output4.7z" # 압축된 결과 파일
with multivolumefile.open(outfile, mode='wb', volume=1023) as target_archive:
with py7zr.SevenZipFile(target_archive, 'w') as archive:
archive.write(orifile, arcname="a.bin")

for fileinfo in target_archive._fileinfo:
print(fileinfo.filename)

# out\output4.7z.0001
# out\output4.7z.0002

writeall -> write 함수로 바꾸고, arcname 인자 사용하였습니다.


멀티 볼륨 파일 목록 시점 문제

다른 하나의 문제점은 멀티 볼륨으로 생성된 파일들을 그때 그때마다 처리를 했었는데요. 실제 프로젝트에서 사용해보니 file이 제대로 생성 안되는 flush 문제가 발생하는 듯 했습니다.

그래서 멀티 볼륨된 파일들을 처리하기 위해서는 아래 예제처럼 모두 생성된 후 이용하도록 해야합니다.

zfilelist = [] # 파일 목록을 저장하는 변수
# 압축 안함 FILTER_COPY
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:
zfilelist.append(fileinfo.filename)

# 파일 이름을 처리할때는 모두 완료된후 아래와 같은 형태로 처리 하도록 합니다.
for filename in zfilelist:
print(filename)


두 가지 예제를 추가한 새로운 코드를 공개합니다.

sourcecode/7z_vol_make_archive.py at main · donarts/sourcecode · GitHub


댓글 없음:

댓글 쓰기