搜了很多资料,基本都是下方这一版代码
import os
import zipfile
def zip_by_volume(file_path, save_dir, block_size):
"""zip文件分卷压缩"""
block_size = block_size * 1024 * 1024
# 文件字节数
file_size = os.path.getsize(file_path)
# 除去文件名以外的path,文件名
path, file_name = os.path.split(file_path)
# 文件后缀名
suffix = file_name.split('.')[-1]
# 添加到临时压缩文件
zip_file = save_dir + file_name + '.zip'
with zipfile.ZipFile(zip_file, 'w') as zf:
zf.write(file_path, arcname=file_name)
# 小于分卷尺寸则直接返回压缩文件路径
if file_size <= block_size:
return zip_file
else:
fp = open(zip_file, 'rb')
count = file_size // block_size + 1
# 拆分压缩包为分卷文件
for i in range(1, count + 1):
_suffix = 'z{:0>2}'.format(i) if i != count else 'zip'
name = save_dir + os.sep + file_name.replace(str(suffix), _suffix)
f = open(name, 'wb+')
if i == 1:
# 添加分卷压缩header(4字节)
f.write(b'\x50\x4b\x07\x08')
f.write(fp.read(block_size - 4))
else:
f.write(fp.read(block_size))
fp.close()
# 删除临时的 zip 文件
os.remove(zip_file)
return save_dir
if __name__ == '__main__':
path = zip_by_volume(r"/Users/lqc/Desktop/test.dmg", r"/Users/lqc/Desktop/test/", 100)
print(path)
可以参考代码注释进行简单的调整改动,目前代码分卷压缩的block_size单位为M,不过在mac下看压缩出来的文件大小显示总会大一点,可能是系统的原因。