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

Python新手求助:多XML文件提取数据后Pandas DataFrame导出Excel结果异常

问题分析与解决方法

我来帮你拆解下问题的核心原因,以及对应的修复方案:

为什么会出现这个问题?

你当前的代码存在两个关键的逻辑漏洞:

  1. 数据没有累加:每次处理一个XML文件时,你都重新初始化了Data和col_title列表,导致每个文件的数据都被存在独立的单元素列表里,而不是把所有文件的VersionID值汇总到同一个列表中。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:27:45