如何高效解析大型XML文件生成指定字段的两列pandas DataFrame
百万级大型XML转Pandas DataFrame实现方案
核心逻辑
- 针对超百万节点的大体积XML,不使用全量加载的DOM解析,采用Python内置的
xml.etree.ElementTree.iterparse做流式迭代解析,内存占用极低,不会出现内存溢出问题 - 解析结果先存入Python列表,全量处理完成后一次性转换为Pandas DataFrame,避免逐行追加DataFrame的性能损耗
- 每处理完成一个Site节点立即清理内存,避免无用节点堆积占用内存
可直接运行的代码
import xml.etree.ElementTree as ET import pandas as pd # 替换为你的实际XML文件路径 XML_FILE_PATH = "your_file.xml" parsed_data = [] # 仅监听元素解析完成的事件,减少无效触发 for event, element in ET.iterparse(XML_FILE_PATH, events=("end",)): if element.tag == "Site": # 提取Site节点的id属性 site_id = element.get("id") # 直接用XPath定位ItemType为C的Item下的ItemValue节点 target_node = element.find(".//Item[@ItemType='C']/ItemValue") c_item_code = target_node.get("Code") if target_node is not None else None parsed_data.append({ "site_id": site_id, "c_type_item_code": c_item_code }) # 清理当前节点内存,必须加否则大文件会内存溢出 element.clear() # 清理根节点残留引用,进一步优化内存占用 while element.getprevious() is not None: del element.getparent()[0] # 转换为目标DataFrame result_df = pd.DataFrame(parsed_data) # 可选:过滤掉没有对应C类型Item的记录 # result_df = result_df.dropna(subset=["c_type_item_code"])
补充说明
如果你的XML文件带有命名空间(根节点有xmlns="xxx"类属性),需要在XPath查询时补充命名空间参数,调整find语句即可。
内容的提问来源于stack exchange,提问作者ulanmitar
相关产品推荐
相关产品推荐

