同版本Pandas运行Excel写入代码报BadZipFile: File is not a zip file错误如何解决
问题解决:循环读写Excel抛出
BadZipFile: File is not a zip file错误 错误根源
- 资源操作顺序错误:原代码先执行
workbook.close()再执行writer.save(),会导致写入磁盘的XLSX文件内容残缺。XLSX本质是ZIP格式压缩包,残缺的文件自然无法被识别为合法压缩包,触发对应报错。 - 引擎混用隐患:首次写入用xlsxwriter、追加写入用openpyxl,两个引擎对XLSX格式的细节处理存在差异,容易生成不符合规范的XLSX文件。
- 认知纠正:你提到的「openpyxl最新版本仅支持XLS文件」是错误认知,实际openpyxl仅支持XLSX/XLSM等新式Excel格式,不支持老旧的XLS格式,XLS格式需要用xlrd库处理。
- 新旧电脑表现差异的原因:旧电脑上的xlsxwriter/openpyxl版本更低,老版本对资源释放的校验逻辑更宽松,兼容你错误的操作顺序,新版本校验更严格,所以直接抛出错误。
修复方案
核心优化点
- 统一使用openpyxl作为读写引擎,避免跨引擎兼容问题
- 调整资源操作顺序,先保存再释放资源,无需重复关闭多个对象
- 若要简化代码避免手动处理资源释放问题,可升级到Pandas 1.4及以上版本,使用
with上下文管理器+mode='a'+if_sheet_exists参数自动处理写入逻辑。
适配Pandas 1.0.1版本的修复后代码
import pandas as pd from openpyxl import load_workbook import os # 每次循环前判断文件是否存在 file_exists = os.path.isfile(fileName) if not file_exists: # 首次写入创建文件 writer = pd.ExcelWriter(fileName, engine='openpyxl') totalDF.applymap(lambda x: str(x).replace('.',',')).to_excel(writer, sheet_name=sheet, startrow=0 , startcol=0, index=False) else: # 追加写入 book = load_workbook(fileName) writer = pd.ExcelWriter(fileName, engine='openpyxl') writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) totalDF.applymap(lambda x: str(x).replace('.',',')).to_excel(writer, sheet_name=sheet, index=False) # 统一设置列宽和额外写入内容 worksheet = writer.sheets[sheet] worksheet.column_dimensions['A'].width = 11 worksheet.column_dimensions['B'].width = 25 worksheet.column_dimensions['C'].width = 12 worksheet.column_dimensions['D'].width = 25 worksheet.column_dimensions['E'].width = 20 worksheet.cell(row=2, column=7).value = str(piranomsComProblema) # 正确操作顺序:先保存再关闭 writer.save() writer.close()
内容的提问来源于stack exchange,提问作者Pedro de Sá
相关产品推荐
相关产品推荐

