从含嵌套Zip的Tar文件提取XML失败,脚本问题求助
解决嵌套压缩文件(Tar→Zip→Zip→XML)的提取问题
我帮你梳理下原脚本的问题,再给你一个能正常工作的版本哈~你要处理的是「Tar包套两层Zip,最终提取最内层XML」的场景,原脚本有几个关键逻辑没处理到位:
- 只处理了Tar里的第一层Zip,完全没碰里面嵌套的第二层Zip,自然拿不到最内层的XML文件
content.extract(content)这行代码逻辑错误:ZipFile.extract()需要传入压缩包内的具体成员名称,而不是ZipFile对象本身- 没有针对XML文件做筛选,就算提取了中间文件,也没定位到目标文件
修正后的完整脚本
import tarfile import os from zipfile import ZipFile # 设置提取文件的存放目录,替换成你实际的路径 os.chdir("C://.../temp/foo") # 打开目标Tar文件,记得补全完整的文件路径哦 with tarfile.open("C://你的完整路径/大型Tar文件.tar", 'r') as tar: # 遍历Tar包内的所有成员 for tar_member in tar.getmembers(): # 先筛选第一层的Zip文件 if tar_member.name.endswith(".zip"): # 读取Tar内的Zip文件对象(无需提前提取到本地) with tar.extractfile(tar_member) as zip1_file: # 打开第一层Zip包 with ZipFile(zip1_file, 'r') as zip1: # 遍历第一层Zip内的所有文件 for zip1_member in zip1.namelist(): # 筛选第二层嵌套的Zip文件 if zip1_member.endswith(".zip"): # 读取第二层Zip的文件对象 with zip1.open(zip1_member) as zip2_file: # 打开第二层Zip包 with ZipFile(zip2_file, 'r') as zip2: # 遍历第二层Zip内的文件,找到目标XML for zip2_member in zip2.namelist(): if zip2_member.endswith(".xml"): # 提取XML文件到当前工作目录 zip2.extract(zip2_member) print(f"已成功提取目标XML:{zip2_member}")
脚本关键说明
- 用
with语句自动管理文件资源,不用手动调用close(),避免资源泄漏 - 分层处理嵌套压缩包:从Tar到第一层Zip,再到第二层Zip,每一层都精准筛选对应格式的文件
- 直接通过文件对象读取嵌套的压缩包,不需要先提取中间层的Zip到本地,节省磁盘空间
- 明确筛选
.xml结尾的目标文件,只提取你需要的内容,避免冗余文件
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

