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

Python遍历目录下所有XML文件提取数据并整合为DataFrame

批量XML数据提取并汇总到DataFrame优化方案

核心优化思路

  • 把单文件提取逻辑封装为独立函数,减少冗余代码,同时加入异常容错,避免单个损坏文件中断全量任务
  • 用标准库os遍历目标路径下所有XML文件,无需硬编码文件名
  • 所有提取结果先存入内存列表,最后一次性构造DataFrame,相比循环中逐行拼接DataFrame性能提升明显
  • 简化单节点取值逻辑,用列表推导式替代冗余的循环append操作,代码更简洁

完整实现代码

import pandas as pd
import xml.etree.cElementTree as et
import datetime
import os

def parse_single_xml(file_path: str) -> list:
    """解析单个XML文件,返回提取到的结构化行数据"""
    rows = []
    try:
        tree = et.parse(file_path)
        root = tree.getroot()

        # 提取格式化更新时间
        ts_node = next(root.iter("lastupdate"))
        last_update = datetime.datetime.fromtimestamp(int(ts_node.text)).strftime("%Y-%m-%d %H:%M:%S")

        # 批量提取name和value字段,按顺序配对
        name_list = [node.text for node in root.iter("name")]
        value_list = [float(node.text) for node in root.iter("value")]

        # 按需求取前两个字段(in/out)组装行,可根据实际结构调整切片范围
        for name, val in zip(name_list[:2], value_list[:2]):
            rows.append({
                "lastupdate": last_update,
                "direction": name,
                "flow_value": val,
                "source_file": os.path.basename(file_path) # 可选:记录来源文件名,方便后续排查数据问题
            })
    except Exception as e:
        print(f"跳过异常文件 {file_path},错误原因:{str(e)}")
    return rows

if __name__ == "__main__":
    xml_dir = "/data/dump_xml/"
    all_data = []

    # 遍历目录下所有XML后缀文件
    for filename in os.listdir(xml_dir):
        if filename.lower().endswith(".xml"):
            full_path = os.path.join(xml_dir, filename)
            all_data.extend(parse_single_xml(full_path))

    # 汇总为DataFrame
    final_df = pd.DataFrame(all_data)
    
    # 打印验证结果,和单文件输出格式对齐
    for _, row in final_df.iterrows():
        print(f"{row['lastupdate']}  {row['direction']}   {row['flow_value']:.10e}")

    # 如需持久化存储,直接调用to_csv/to_excel即可
    # final_df.to_csv("xml_extract_result.csv", index=False)

注意事项

  • 代码默认每个XML文件中name和value节点顺序一一对应,取前两个节点为in/out流量值,如果XML结构有其他层级规则,可以调整配对逻辑
  • 提取value时直接转为float类型,方便后续做数值计算,不需要的话可以去掉float()转换保留字符串格式
  • 如果目录下XML文件量超过10万,可以考虑换glob模块或者多进程加速解析,常规几千个文件的场景当前代码足够用

内容的提问来源于stack exchange,提问作者Codec737

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:36:45