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
相关产品推荐
相关产品推荐

