如何用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
相关产品推荐
相关产品推荐

