Python新手求助:多XML文件提取数据后Pandas DataFrame导出Excel结果异常
问题分析与解决方法
我来帮你拆解下问题的核心原因,以及对应的修复方案:
为什么会出现这个问题?
你当前的代码存在两个关键的逻辑漏洞:
- 数据没有累加:每次处理一个XML文件时,你都重新初始化了
Data和col_title列表,导致每个文件的数据都被存在独立的单元素列表里,而不是把所有文件的VersionID值汇总到同一个列表中。 - Excel文件被重复覆盖:你在循环内部调用
df.to_excel('output.xlsx'),这意味着每处理一个文件,就会生成一个新的Excel文件覆盖掉之前的,所以最终只能看到最后一个文件的数据。
这也是为什么你打印df时会看到多个独立的小DataFrame,打印Data时是多个单元素列表的原因。
修正后的代码
下面是调整后的完整代码,我已经帮你补上了遍历多个XML文件的逻辑(用glob获取目录下所有XML文件),同时修复了数据累加和Excel覆盖的问题:
import pandas as pd import xml.etree.ElementTree as ET import glob # 初始化存储所有数据的列表,放在循环外部,确保数据能累加 all_version_data = [] column_title = [] # 获取当前目录下所有XML文件(如果XML在子目录,可修改为"**/*.xml"并设置recursive=True) xml_file_paths = glob.glob("*.xml") for file_path in xml_file_paths: tree = ET.parse(file_path) # 查找当前XML中的VersionID标签(每个文件只有一个,用find比findall更合适) version_element = tree.find("VersionID") # 防止部分XML文件没有VersionID标签导致报错 if version_element is not None: all_version_data.append(version_element.text) # 只设置一次列标题,避免重复添加 if not column_title: column_title.append(version_element.tag) # 所有文件处理完成后,统一创建DataFrame df = pd.DataFrame(all_version_data, columns=column_title) # 导出到Excel,index=False去掉默认的索引列,更符合你的预期输出 df.to_excel('output.xlsx', index=False) # 测试打印结果 print(df)
关键修改点说明
- 数据累加逻辑:把存储数据的列表
all_version_data和列标题column_title移到循环外部,这样每次处理文件时,都会把当前文件的VersionID值追加到同一个列表中,而不是重新创建列表。 - 遍历多文件:用
glob.glob("*.xml")自动获取当前目录下所有XML文件,不用手动逐个指定文件路径。 - 标签查找优化:因为每个XML文件中只有一个
VersionID标签(从你的示例结构来看),所以用tree.find()直接获取单个元素比findall()更高效,也避免了不必要的循环。 - 容错处理:添加
if version_element is not None的判断,防止部分XML文件缺失VersionID标签导致代码报错。 - 避免Excel覆盖:把
df.to_excel()移到循环外部,等所有数据都收集完成后再统一导出,这样就不会出现覆盖的问题。
运行这段代码后,你的Excel文件应该会包含所有XML文件中的VersionID值,和你预期的输出一致。
内容的提问来源于stack exchange,提问作者yl129
相关产品推荐
相关产品推荐

