You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同版本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版本更低,老版本对资源释放的校验逻辑更宽松,兼容你错误的操作顺序,新版本校验更严格,所以直接抛出错误。

修复方案

核心优化点

  1. 统一使用openpyxl作为读写引擎,避免跨引擎兼容问题
  2. 调整资源操作顺序,先保存再释放资源,无需重复关闭多个对象
  3. 若要简化代码避免手动处理资源释放问题,可升级到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á

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:09:03