py7zr与Linux命令行7zip解压7z归档的差异及修复方案
py7zr解压保留完整Windows路径 vs 7za e的差异原因及解决方法
原因分析
- 归档路径存储问题:Windows版7-Zip UI创建归档时,若从深层目录(如
Program Files/My Sub Dir/My Sub Dir 2/)选择autocfg文件夹添加,默认会将该文件夹的完整绝对路径写入归档元数据。Windows版7-Zip查看归档时会自动隐藏前缀路径,导致你误以为归档仅包含autocfg目录,但实际上归档内的文件都带有完整Windows路径前缀。 - 解压行为差异:py7zr默认的
extractall()方法与7za x命令行为一致,会严格遵循归档中存储的完整路径结构解压文件;而7za e是专门的扁平化提取命令,会忽略所有文件的路径信息,直接将所有文件提取到指定目录,这是两者行为不同的核心。
解决方法
方法1:完全扁平化提取(匹配7za e)
遍历归档内所有文件,忽略原有路径,直接写入目标目录:
import py7zr target_dir = "/path/to/site-packages" with py7zr.SevenZipFile("your_archive.7z", mode='r') as zf: for file_name in zf.getnames(): # 跳过目录条目 if file_name.endswith('/'): continue # 仅保留文件名,丢弃所有路径前缀 pure_filename = file_name.split('/')[-1] dest_path = f"{target_dir}/{pure_filename}" # 读取并写入文件 with zf.open(file_name) as src_file, open(dest_path, 'wb') as dest_file: dest_file.write(src_file.read())
方法2:保留autocfg及以下路径
若希望仅保留autocfg层级及以下的目录结构,而非完全扁平化,可截取路径从autocfg开始的部分:
import py7zr import os target_dir = "/path/to/site-packages" with py7zr.SevenZipFile("your_archive.7z", mode='r') as zf: for file_name in zf.getnames(): # 跳过目录条目 if file_name.endswith('/'): continue # 截取autocfg及后续路径部分 if 'autocfg' in file_name: relative_part = file_name.split('autocfg/', 1)[1] dest_path = os.path.join(target_dir, 'autocfg', relative_part) # 确保目标目录存在 os.makedirs(os.path.dirname(dest_path), exist_ok=True) # 写入文件 with zf.open(file_name) as src_file, open(dest_path, 'wb') as dest_file: dest_file.write(src_file.read())
内容的提问来源于stack exchange,提问作者gdogg371
相关产品推荐
相关产品推荐

