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
相关产品推荐
相关产品推荐

