如何用Python的ZipFile类模拟7z命令实现指定压缩效果?
解决思路:你混淆了归档格式!
哦,这个问题我之前踩过坑!核心问题在于:你的原7z命令生成的是7z格式的压缩包,但zipfile的ZIP_LZMA只是在ZIP格式容器里用LZMA算法压缩——这俩是完全不同的文件格式,接收方自然会报格式错误。
先拆解下你原7z命令的关键参数含义,方便对应模拟:
-t7z:明确指定生成7z格式归档(不是ZIP)-ms=off:关闭「固实压缩」模式,让每个文件独立压缩(而非把所有文件打包成一个块压缩)a:创建新归档并添加文件,*表示当前目录下所有文件
为什么zipfile做不到?
标准库的zipfile模块只能处理ZIP格式,根本不支持生成7z格式的文件,所以不管怎么调整参数,都没法匹配原7z命令的输出格式。这时候得换用支持7z格式的第三方库——推荐用py7zr,这是目前维护最活跃的7z处理Python库。
用py7zr模拟原7z命令的代码示例
首先安装依赖:
pip install py7zr
然后编写代码,完全匹配原命令的行为:
import py7zr import os filename = "your_target_archive.7z" # 对应7z a -t7z -ms=off {filename} * with py7zr.SevenZipFile( filename, mode='w', compression=py7zr.LZMA2, # 7z默认压缩算法,和原命令一致 solid=False # 对应-ms=off,关闭固实压缩 ) as archive: # 遍历当前目录所有文件/子目录,排除归档文件本身 for root, _, files in os.walk('.'): for file in files: if file == filename: continue file_path = os.path.join(root, file) # 保持相对路径添加文件,和7z *的行为完全一致 archive.write(file_path, arcname=os.path.relpath(file_path, '.'))
补充:如果接收方其实支持ZIP格式?
如果接收方只是要求用LZMA压缩的ZIP包(而非7z格式),那你之前的zipfile代码可能只是缺了文件遍历逻辑,正确写法如下(但要注意部分旧应用不支持ZIP的LZMA压缩):
from zipfile import ZipFile, ZIP_LZMA import os filename = "your_target_archive.zip" with ZipFile(filename, 'w', ZIP_LZMA) as zf: for root, _, files in os.walk('.'): for file in files: if file == filename: continue file_path = os.path.join(root, file) zf.write(file_path, arcname=os.path.relpath(file_path, '.'))
但根据你的问题描述,原命令是生成7z格式,所以第一种用py7zr的方案才是正确匹配原命令效果的选择。
内容的提问来源于stack exchange,提问作者JabberJabber
相关产品推荐
相关产品推荐

