for循环合并多文件夹日志到Excel仅存最后数据,问题出在哪?
问题原因
你的代码在遍历每个日志文件时,每次都直接调用df.to_excel("logfile.xlsx", index=False),这会覆盖之前生成的Excel文件,所以最终只会保留最后一个文件处理后的结果。
修复方案
需要先把所有文件解析得到的DataFrame收集起来,合并成一个大的DataFrame后,再一次性写入Excel:
import os import pandas as pd import bs4 path = "D:\\logfolder" filelist = [] for root, dirs, files in os.walk(path): for file in files: if file.endswith("History.txt"): filelist.append(os.path.join(root, file)) # 初始化一个列表存储所有DataFrame df_list = [] for name in filelist: print(name + "\n") for name in filelist: with open(name,"r") as f: soupObj = bs4.BeautifulSoup(f, "lxml") df = pd.DataFrame([(x["uri"], *x["t"].split("T"), x["u"], x["desc"]) for x in soupObj.find_all("log")], columns=["Database", "Date", "Time", "User", "Description"]) # 将当前文件的DataFrame加入列表 df_list.append(df) # 合并所有DataFrame combined_df = pd.concat(df_list, ignore_index=True) # 一次性写入Excel combined_df.to_excel("logfile.xlsx", index=False)
补充说明
pd.concat(df_list, ignore_index=True)会把列表里的所有小DataFrame纵向拼接,ignore_index=True用于重置合并后的索引,避免出现重复索引的问题。- 如果日志文件体积过大、内存不足,可以考虑逐文件追加写入的方式,需要配合
ExcelWriter实现:
from openpyxl import load_workbook for idx, name in enumerate(filelist): # 解析得到df的代码保持不变 if idx == 0: # 第一个文件直接写入,包含表头 df.to_excel("logfile.xlsx", index=False) else: # 后续文件追加,不重复写入表头 book = load_workbook("logfile.xlsx") writer = pd.ExcelWriter("logfile.xlsx", engine='openpyxl') writer.book = book writer.sheets = {ws.title: ws for ws in book.worksheets} df.to_excel(writer, index=False, header=False, startrow=writer.sheets['Sheet1'].max_row) writer.close()
内容的提问来源于stack exchange,提问作者Rejoy
相关产品推荐
相关产品推荐

