for循环写入Excel仅保留最后一行数据,求解决方案
问题分析与解决思路
我来帮你排查下问题——核心原因很简单:你每次循环都会重新创建并覆盖整个Excel文件,所以最后只剩下最后一次循环的数据。不管是第一种xlsxwriter的写法,还是注释掉的pandas to_excel写法,都犯了同一个错误:把文件的创建/打开操作放在了循环内部,导致每次循环都生成新文件,覆盖之前的内容。
下面给你两种靠谱的解决办法,按需选择:
方法一:先收集所有数据,一次性写入(推荐)
这种方式更高效,也符合pandas的使用习惯,适合大多数场景:
import pandas as pd from pandas import ExcelWriter if __name__ == "__main__": # 先创建空列表,用来存储所有循环生成的字典数据 all_data = [] for x in List: # 注意这里修正了你代码里的拼写错误:my_dic → my_dict my_dict = { "ID": x, "mail_one": Email, "second_mail": second_mail, "Num": str(Num), "date": Date } print(my_dict) all_data.append(my_dict) # 所有数据收集完成后,一次性转成DataFrame写入Excel df = pd.DataFrame(all_data) # 使用with语句可以自动处理文件关闭,更安全 with ExcelWriter('ID_Num.xlsx') as writer: df.to_excel(writer, 'ID_Num', index=False)
方法二:逐行写入(适合超大数据量,不想占用过多内存)
如果你的数据量极大,没办法一次性存到内存里,可以把文件的初始化放在循环外面,循环内只做写入操作:
import xlsxwriter if __name__ == "__main__": # 循环外创建工作簿和工作表,只做一次 workbook = xlsxwriter.Workbook('ID_Num.xlsx') worksheet = workbook.add_worksheet() # 先写入表头 headers = ["ID", "mail_one", "second_mail", "Num", "date"] for col_idx, header in enumerate(headers): worksheet.write(0, col_idx, header) # 从第2行(索引1)开始写入数据 current_row = 1 for x in List: # 准备当前行的数据 row_content = [ x, Email, second_mail, str(Num), Date ] # 写入整行 worksheet.write_row(current_row, 0, row_content) current_row += 1 # 最后一定要关闭工作簿,不然数据不会写入 workbook.close()
另外还要提醒你:原代码里有个拼写错误,my_dic = {}应该是my_dict = {},不然会抛出变量未定义的错误,记得修正哦~
内容的提问来源于stack exchange,提问作者soBusted
相关产品推荐
相关产品推荐

