python3中zip分卷压缩代码

搜了很多资料,基本都是下方这一版代码

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下看压缩出来的文件大小显示总会大一点,可能是系统的原因。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍