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

pandas保存多个DataFrame到单个Excel文件时报ValueError错误

问题描述

将多个DataFrame保存到单个Excel文件时触发报错:

ValueError: I/O operation on closed file

原实现代码如下:

import pandas as pd

path  = ['path1.txt', 'path2.txt', 'path3.txt']

data = []
data = [pd.read_csv(i, sep=" ") for i in path]
 
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
    for i in range(len(data)):
        data[i].to_excel(writer, sheet_name= path[i].replace(".txt", ""), index=False)
    writer.save()
writer.close()
问题根因
  • 你使用了with上下文管理器创建ExcelWriter实例,该语法会在代码块退出时自动执行文件保存、文件句柄关闭的全流程资源释放操作,不需要手动干预。
  • 你在with块内手动调用writer.save()、块外手动调用writer.close()属于重复操作:第一次执行完保存关闭后,后续的I/O操作会直接作用在已经关闭的文件句柄上,直接触发报错。
  • 补充说明:pandas 1.2.0及以上版本中,openpyxl引擎适配的ExcelWriter上下文管理器已经完全内置了安全的保存、关闭逻辑,手动调用这两个方法会打乱内置的资源释放时序。
修正方案

直接删除多余的writer.save()和writer.close()调用即可,修正后可正常运行的代码如下:

import pandas as pd

path  = ['path1.txt', 'path2.txt', 'path3.txt']
data = [pd.read_csv(i, sep=" ") for i in path]
 
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
    for i in range(len(data)):
        data[i].to_excel(writer, sheet_name=path[i].replace(".txt", ""), index=False)

如果不使用with上下文管理器、需要手动控制写入生命周期,才需要按顺序手动调用保存和关闭方法,示例写法如下(非必要不推荐):

writer = pd.ExcelWriter("output.xlsx", engine="openpyxl")
for i in range(len(data)):
    data[i].to_excel(writer, sheet_name=path[i].replace(".txt", ""), index=False)
writer.save()
writer.close()

内容的提问来源于stack exchange,提问作者Lucas Cordeiro Romão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:06:33