You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python分割压缩文件夹为指定大小多卷并显示进度条?

Python实现大文件分卷压缩(1GB单卷)

针对大文件(如几十GB的游戏文件)的分卷压缩需求,以下提供两种Pythonic解决方案:

方案一:标准库实现(先压缩后分割)

利用zipfile完成压缩,再手动分割压缩文件为1GB分卷,无需第三方依赖。缺点是需临时存储完整压缩包,要求足够磁盘空间。

实现代码

import zipfile
import os

def compress_and_split(input_file, chunk_size=1024*1024*1024):
    # 第一步:生成完整压缩包
    zip_filename = f"{os.path.basename(input_file)}.zip"
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zf:
        zf.write(input_file, os.path.basename(input_file))
    print(f"已生成完整压缩包:{zip_filename}")

    # 第二步:分割压缩包为指定大小分卷
    base_name = os.path.splitext(zip_filename)[0]
    total_size = os.path.getsize(zip_filename)
    total_parts = (total_size + chunk_size - 1) // chunk_size

    with open(zip_filename, 'rb') as f_in:
        for part_num in range(1, total_parts+1):
            # 按标准分卷命名:前序为 .z01/.z02,最后一个保留 .zip
            if part_num == total_parts:
                part_filename = zip_filename
            else:
                part_filename = f"{base_name}.z{str(part_num).zfill(2)}"
            
            chunk = f_in.read(chunk_size)
            with open(part_filename, 'wb') as f_out:
                f_out.write(chunk)
            print(f"已生成分卷:{part_filename}")
    
    # 删除临时完整压缩包
    os.remove(zip_filename)

def merge_and_extract(part_prefix):
    # 合并分卷并解压,part_prefix为原文件名(如"game")
    part_patterns = [f"{part_prefix}.z{str(i).zfill(2)}" for i in range(1, 100)] + [f"{part_prefix}.zip"]
    existing_parts = sorted([f for f in os.listdir('.') if f in part_patterns])
    
    merged_zip = f"{part_prefix}_merged.zip"
    with open(merged_zip, 'wb') as f_out:
        for part in existing_parts:
            with open(part, 'rb') as f_in:
                f_out.write(f_in.read())
    
    # 解压合并后的压缩包
    with zipfile.ZipFile(merged_zip, 'r') as zf:
        zf.extractall()
    print("合并解压完成")

    # 清理临时文件
    os.remove(merged_zip)
    for part in existing_parts:
        os.remove(part)

方案二:第三方库py7zr(直接分卷压缩)

基于7-Zip格式实现原生分卷压缩,无需临时大文件,效率更高,生成的分卷兼容7-Zip工具。需先安装依赖:

pip install py7zr

实现代码

import py7zr
import os

def split_compress_with_py7zr(input_file, chunk_size=1024*1024*1024):
    base_name = os.path.basename(input_file)
    # split_size参数指定单卷字节数
    with py7zr.SevenZipFile(f"{base_name}.7z", 'w', split_size=chunk_size) as szf:
        szf.write(input_file, os.path.basename(input_file))
    print("分卷压缩完成,生成文件:", 
          [f for f in os.listdir('.') if f.startswith(os.path.splitext(base_name)[0])])

def extract_7z_split(archive_name):
    # 直接读取分卷并解压(需确保所有分卷在同一目录)
    with py7zr.SevenZipFile(archive_name, 'r') as szf:
        szf.extractall()
    print("分卷解压完成")

使用说明

  • 方案一适合无第三方依赖场景,需注意磁盘剩余空间;
  • 方案二更适合超大型文件,压缩过程直接分卷,无需临时存储完整包,且分卷格式通用。

内容的提问来源于stack exchange,提问作者blues

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:33