多XML文件子字段解析与匹配列合并的实现方法
批量处理XML生成目标DataFrame解决方案
核心思路
先统一收集所有可能的sifra值(保证所有行的列一致),再遍历每个XML提取数据,缺失的sifra自动填充0,最终合并为DataFrame。
完整代码实现
依赖准备
确保已安装pandas:
pip install pandas
代码片段
import xml.etree.ElementTree as ET import pandas as pd import os # 解析单个XML文件,返回{sifra: vrednost, 文件名: ...}的字典 def parse_single_xml(xml_path): tree = ET.parse(xml_path) root = tree.getroot() data = {} # 遍历所有<energent>节点提取数据 for energent in root.findall('.//energent'): sifra = energent.find('sifra').text.strip() vrednost = energent.find('vrednost').text.strip() # 转换数值类型,空值默认0 data[sifra] = float(vrednost) if vrednost else 0.0 # 记录当前XML文件名,方便溯源 data['xml_filename'] = os.path.basename(xml_path) return data # 批量处理指定目录下所有XML def batch_process_xml(xml_dir): # 获取目录下所有XML文件(如需递归子目录,改用os.walk) xml_files = [os.path.join(xml_dir, f) for f in os.listdir(xml_dir) if f.lower().endswith('.xml')] all_data = [] all_sifras = set() # 第一步:遍历所有文件,收集数据和所有sifra for xml_file in xml_files: file_data = parse_single_xml(xml_file) all_data.append(file_data) # 收集当前文件的sifra(排除文件名字段) current_sifras = [k for k in file_data.keys() if k != 'xml_filename'] all_sifras.update(current_sifras) # 整理列顺序:文件名 + 排序后的sifra sorted_sifras = sorted(all_sifras) columns = ['xml_filename'] + sorted_sifras # 第二步:对齐每一行数据,缺失sifra填0 aligned_rows = [] for row_data in all_data: aligned_row = {col: row_data.get(col, 0.0) for col in columns} aligned_rows.append(aligned_row) # 生成DataFrame return pd.DataFrame(aligned_rows) # ----------------------调用示例---------------------- # 替换为你的XML文件所在目录 xml_dir = './your_xml_folder' result_df = batch_process_xml(xml_dir) # 输出到指定格式(CSV/Excel) result_df.to_csv('energent_output.csv', index=False) result_df.to_excel('energent_output.xlsx', index=False)
关键优化点
- 动态列适配:自动收集所有出现过的
sifra,无需预先定义固定列,适配未知的sifra场景。 - 数值处理:自动将
vrednost转为数值类型,空值直接填充0,避免后续计算报错。 - 可扩展性:如果XML分布在子目录,将
os.listdir替换为os.walk即可递归遍历。
示例输出(对应需求格式)
假设两个XML文件分别包含不同的sifra,生成的DataFrame结构如下:
| xml_filename | 101 | 102 | 103 |
|---|---|---|---|
| data_001.xml | 25.5 | 0.0 | 18.0 |
| data_002.xml | 0.0 | 30.0 | 15.0 |
内容的提问来源于stack exchange,提问作者energyMax
相关产品推荐
相关产品推荐

