使用py7zr创建7z归档后提取失败,报invalid header data等错误求助
问题分析与解决
核心问题:归档未正确完成写入
你的代码存在两个关键问题:创建归档时未关闭文件对象,导致归档元数据未写入磁盘;直接复用写入模式的SevenZipFile对象进行提取,内部状态不兼容读取操作,这是所有错误的根源。
修正后的完整代码
# path: 7zip_test.py import py7zr as z import sys import os # 创建指定目录的归档 def create_archive(directory): fname = directory.split('\\')[-1] archive_path = f'{fname}.7z' # 用with上下文管理器自动处理文件打开/关闭,确保归档写入完整 with z.SevenZipFile(archive_path, mode='w', compression_level=0) as archive: archive.writeall(directory) return archive_path # 返回归档路径而非对象,避免操作已关闭的文件 # 提取归档到EXTRACT_TEST目录 def extract_archive(archive_path): directory = 'EXTRACT_TEST' # 简化目录创建逻辑 os.makedirs(directory, exist_ok=True) # 以读取模式重新打开归档进行提取 with z.SevenZipFile(archive_path, mode='r') as archive: archive.extractall(directory) # 创建归档后立即提取 def create_then_extract(directory): archive_path = create_archive(directory) extract_archive(archive_path)
错误原因拆解
Bad7zFile: invalid header data
创建归档后未关闭SevenZipFile对象,归档的签名头、元数据等关键信息并未写入磁盘,生成的.7z文件是不完整的损坏文件,读取时自然会提示头部无效。AttributeError: 'PackInfo' object has no attribute 'packpositions'
写入模式的SevenZipFile对象内部状态是为写入流程设计的,没有初始化读取所需的属性(如packpositions),不能直接用于提取操作。必须关闭写入的归档后,以读取模式重新打开。
额外优化说明
- 直接在
SevenZipFile初始化时指定compression_level参数,无需后续赋值。 - 用
os.makedirs(exist_ok=True)替代手动判断目录是否存在,代码更简洁健壮。 - 返回归档路径而非文件对象,避免因操作已关闭的对象引发意外错误。
内容的提问来源于stack exchange,提问作者amariani
相关产品推荐
相关产品推荐

