# -*- coding: utf-8 -*- """测试 STEP 文件的 zip 压缩率 —— 判断"下载时压缩"能省多少。""" import zipfile, os, tempfile FILES = [ r'D:/开发/OnebotCatalog/onebot-data/catalog/step/UAGP155__045BS0.step', r'D:/开发/OnebotCatalog/onebot-data/catalog/step/LAGP210OA045BC.step', r'D:/开发/OnebotCatalog/onebot-data/catalog/step/ULP50040AEK0.step', r'D:/开发/OnebotCatalog/onebot-data/catalog/step/UCBP40OESK0.step', ] tmp = tempfile.mkdtemp() tot_raw = tot_def = tot_sto = 0 print(f'{"文件":30s} {"原始":>9s} {"deflate":>9s} {"压缩率":>7s}') for f in FILES: if not os.path.exists(f): print(f' 缺失: {f}') continue raw = os.path.getsize(f) tot_raw += raw sizes = {} for lvl, tag in ((zipfile.ZIP_DEFLATED, 'def'), (zipfile.ZIP_STORED, 'sto')): p = os.path.join(tmp, tag + '.zip') with zipfile.ZipFile(p, 'w', lvl) as z: z.write(f, os.path.basename(f)) sizes[tag] = os.path.getsize(p) tot_def += sizes['def'] tot_sto += sizes['sto'] print(f'{os.path.basename(f):30s} {raw/1048576:8.2f}M {sizes["def"]/1048576:8.2f}M ' f'{(1-sizes["def"]/raw)*100:6.1f}%') if tot_raw: print(f'\n合计 {len(FILES)} 个: 原始 {tot_raw/1048576:.2f}MB') print(f' deflate {tot_def/1048576:.2f}MB (省 {(1-tot_def/tot_raw)*100:.1f}%)') print(f' 不压缩 {tot_sto/1048576:.2f}MB') # 同时测 .opc 整包压缩率(判断主包还有多少水分) opc = r'D:/开发/OnebotCatalog/sample/OnebotCatalog_2026.08.opc' if os.path.exists(opc): print(f'\n.opc 主包: {os.path.getsize(opc)/1073741824:.2f}GB') try: with zipfile.ZipFile(opc) as z: infos = z.infolist() c = sum(i.compress_size for i in infos) u = sum(i.file_size for i in infos) print(f' 内部 {len(infos)} 条目: 未压缩 {u/1073741824:.2f}GB -> 已压缩 {c/1073741824:.2f}GB ' f'(当前压缩率 {(1-c/u)*100:.1f}%)') except Exception as e: print(' 读取失败:', e)