解决循环保存多组件DataFrame至S3同Excel不同工作表仅存最后表的问题
问题修复方案
你的代码之所以只保留COMP3的工作表,是因为循环里每次都会生成全新的Excel文件并覆盖S3中的旧文件。每轮循环都创建一个仅含当前组件工作表的Excel,上传后直接替换之前的版本,最后自然只剩最后一次循环的结果。
修复思路
把Excel文件的初始化、所有工作表的写入操作放在循环外部,一次性完成所有工作表的添加后,再将完整的Excel文件上传到S3,避免多次覆盖。
修复后的代码
import datetime import io import pandas as pd import boto3 today = datetime.datetime.now().strftime('%m_%d_%Y_%H_%M_%S') components = ["COMP1", "COMP2", "COMP3"] filename = 'auto_export_' + today # 先初始化BytesIO和ExcelWriter,所有工作表都写入同一个工作簿 with io.BytesIO() as output: with pd.ExcelWriter(output, engine='xlsxwriter') as writer: for comp in components: df1 = df[df['component'] == comp] print(comp) print(df1) # 如果你的append_df_to_excel是自定义方法,直接替换成这个方法即可 df1.to_excel(writer, sheet_name=comp, index=False) # 所有工作表写入完成后,获取完整的文件内容 data = output.getvalue() # 仅执行一次S3上传,避免覆盖 s3 = boto3.resource('s3') s3.Bucket('mybucket').put_object(Key='folder1/' + filename + '.xlsx', Body=data)
关键说明
- 核心是让所有组件的工作表都写入同一个
pd.ExcelWriter实例,而不是每次循环新建。 - 如果你使用的
append_df_to_excel是自定义的追加工具(比如用来处理重复表头),直接把代码里的to_excel替换成这个方法就行,逻辑不变。 - 最后只做一次S3上传操作,彻底避免文件被多次覆盖。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

