文章目录
脚本
很常用,搞个帖子备份一下方便复制
python3
import os
import zipfile
import sys
from io import BytesIO
def unzip_boost_split_zip(zip_prefix="xxx.zip", inputWorkDir=""):
"""
解压7z生成的zip格式分卷文件
:param zip_prefix: 分卷文件的前缀(如 "boost_1_87_0.zip")
:param inputWorkDir: 分卷文件所在的目录,默认使用当前目录
"""
file_dir = "./"
if inputWorkDir:
file_dir = inputWorkDir
output_dir = file_dir # 解压后的文件存放目录,默认和分卷同目录
# 创建解压目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 按顺序遍历所有分卷文件
all_part_files = []
part_number = 1
while True:
# 拼接分卷文件名(格式:前缀.001、前缀.002...)
part_filename = f"{zip_prefix}.{part_number:03d}"
part_filepath = os.path.join(file_dir, part_filename)
if os.path.exists(part_filepath):
all_part_files.append(part_filepath)
part_number += 1
else:
break # 没有更多分卷则停止
if len(all_part_files) == 0:
print("❌ 错误:未找到任何分卷文件,请检查路径/前缀是否正确!")
return
print(f"✅ 成功识别 {len(all_part_files)} 个分卷文件,开始合并解压...")
# 按顺序读取所有分卷的二进制内容,合并成完整的zip文件流
full_zip_binary = b""
for part_path in all_part_files:
with open(part_path, "rb") as f:
full_zip_binary += f.read()
# 解压合并后的完整zip文件
try:
with zipfile.ZipFile(BytesIO(full_zip_binary), 'r') as zip_file:
zip_file.extractall(output_dir) # 保留完整目录结构解压
print(f"✅ 解压成功!所有文件已保存到: {output_dir}")
except zipfile.BadZipFile:
print("❌ 解压失败:分卷文件缺失/损坏/文件名被修改!")
except Exception as e:
print(f"❌ 解压异常:{str(e)}")
def print_usage():
"""打印脚本使用说明"""
print("📚 脚本使用说明:")
print(" 用法1(仅指定分卷前缀,使用当前目录):")
print(f" python {sys.argv[0]} <zip_prefix>")
print(f" 示例:python {sys.argv[0]} boost_1_87_0.zip")
print(" 用法2(指定分卷目录+分卷前缀):")
print(f" python {sys.argv[0]} <inputWorkDir> <zip_prefix>")
print(f" 示例:python {sys.argv[0]} ./zip_files boost_1_87_0.zip")
if __name__ == "__main__":
input_work_dir = ""
zip_prefix = ""
# 解析命令行参数
if len(sys.argv) == 1:
print("❌ 错误:缺少必要参数!")
print_usage()
sys.exit(1)
elif len(sys.argv) == 2:
# 仅传入1个参数 → 作为zip_prefix,目录用当前目录
zip_prefix = sys.argv[1]
elif len(sys.argv) == 3:
# 传入2个参数 → 第一个是目录,第二个是前缀
input_work_dir = sys.argv[1]
zip_prefix = sys.argv[2]
else:
print("❌ 错误:参数数量过多!")
print_usage()
sys.exit(1)
# 校验前缀参数不能为空
if not zip_prefix:
print("❌ 错误:分卷前缀(zip_prefix)不能为空!")
print_usage()
sys.exit(1)
# 执行解压函数
unzip_boost_split_zip(zip_prefix, input_work_dir)
使用示例
bash
# 示例1:分卷在当前目录,仅指定前缀
python unzip_split_zip.py boost_1_87_0.zip
# 示例2:分卷在 ./my_zip 目录,指定目录+前缀
python unzip_split_zip.py ./my_zip boost_1_87_0.zip