Python操作A001-C-002.zip报Attempt to use ZIP archive that was already closed错误如何处理
错误触发原因
- 你通过
with关键字创建ZipFile对象时,with上下文管理器会自动在代码块执行结束后关闭压缩包资源,无需手动调用close()方法。 - 你将
z.close()写在了遍历压缩包内文件的循环内部,第一次处理完单个内部文件后就直接关闭了压缩包,后续循环尝试读取下一个内部文件时,压缩包已经处于关闭状态,直接抛出对应错误。 - 额外逻辑问题:你使用
os.path.isdir(filename)判断的是本地文件系统中对应路径是否为目录,无法正确识别压缩包内部的目录结构,判断逻辑存在错误。
修复方法
- 删掉手动调用
z.close()的代码行,交由with上下文自动管理压缩包的生命周期 - 替换目录判断逻辑,使用
ZipFile内置的is_dir()方法判断压缩包内路径是否为目录 - 额外优化:外层遍历本地文件、打开本地文件的逻辑完全没有用到打开的文件对象
f,还存在变量名filename重复覆盖的问题,抗体读取逻辑也不需要放在循环内重复执行,可根据实际需求调整冗余逻辑
修复后参考代码:
from pathlib import Path import pandas as pd import zipfile import os import sys path = "./CODEX/input/" # 抗体读取逻辑不需要放在循环里,只读一次即可 ab = pd.read_excel("HUBMAP B004 codex antibodies metadata.xlsx") print(f"Antibody metadata column names:\n {ab.columns.values}") # Patient A001 with zipfile.ZipFile("A001-C-002.zip") as z: for filename in z.namelist(): # 判断压缩包内路径是否为目录 if not z.getinfo(filename).is_dir(): for line in z.open(filename): print(line)
内容的提问来源于stack exchange,提问作者melololo
相关产品推荐
相关产品推荐

