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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:10:54