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

Python解析XML后:如何将输出数据导出至Excel/CSV文件?

问题描述

我有一段使用xml.etree.ElementTree库解析XML文件的Python代码,它会递归提取XML元素的属性与文本内容并打印到控制台。现在需要将这些原本打印到屏幕的全部数据导出至Excel或CSV文件;若无法直接替换打印逻辑,至少要在现有打印语句基础上添加写入Excel/CSV文件的功能。

原代码

import xml.etree.ElementTree as ET

xml = ET.parse('p.xml')

root = xml.getroot()

def getDataRecursive(element):
    data = list()

    # 获取元素属性,所有元素都需要这一步
    for key in element.attrib.keys():
        data.append(element.tag + '.' + key + ' ' + element.attrib.get(key))

    # 只有叶子节点的文本是有效内容(至少在这个示例里是这样)
    if len(element) == 0:
        if element.text is not None:
            data.append(element.tag + ' ' + element.text)

    # 否则递归深入子元素,并将结果拼接到当前标签下
    else:
        for el in element:
            within = getDataRecursive(el)

            for data_point in within:
                data.append(element.tag + '.' + data_point)

    return data
# 打印结果
for x in getDataRecursive(root):
    print(x)

原输出示例

country.name Liechtenstein
country.rank 1
country.year 2008
country.gdppc 141100
country.neighbor.name Austria
country.neighbor.direction E
country.neighbor.name Switzerland
country.neighbor.direction W
country.name Singapore
country.rank 4
country.year 2011
country.gdppc 59900
country.neighbor.name Malaysia
country.neighbor.direction N
country.name Panama
country.rank 68
country.year 2011
country.gdppc 13600
country.neighbor.name Costa Rica
country.neighbor.direction W
country.neighbor.name Colombia
country.neighbor.direction E

解决方案1:导出到CSV文件

CSV格式无需额外依赖,直接使用Python内置的csv模块即可。我们将递归逻辑返回的字符串拆分为键值对,同时保留原有打印功能:

import xml.etree.ElementTree as ET
import csv

xml = ET.parse('p.xml')
root = xml.getroot()

def getDataRecursive(element):
    data = list()

    # 获取元素属性,所有元素都需要这一步
    for key in element.attrib.keys():
        data.append((element.tag + '.' + key, element.attrib.get(key)))

    # 只有叶子节点的文本是有效内容(至少在这个示例里是这样)
    if len(element) == 0:
        if element.text is not None and element.text.strip():
            data.append((element.tag, element.text.strip()))

    # 否则递归深入子元素,并将结果拼接到当前标签下
    else:
        for el in element:
            within = getDataRecursive(el)
            for key, value in within:
                data.append((element.tag + '.' + key, value))

    return data

# 获取所有数据
all_data = getDataRecursive(root)

# 打印并写入CSV文件
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    # 写入表头
    writer.writerow(['Key', 'Value'])
    for key, value in all_data:
        print(f"{key} {value}")
        writer.writerow([key, value])

解决方案2:导出到Excel文件

若需要导出到Excel,可使用openpyxl库(需先执行pip install openpyxl安装),代码逻辑如下:

import xml.etree.ElementTree as ET
from openpyxl import Workbook

xml = ET.parse('p.xml')
root = xml.getroot()

def getDataRecursive(element):
    data = list()

    # 获取元素属性,所有元素都需要这一步
    for key in element.attrib.keys():
        data.append((element.tag + '.' + key, element.attrib.get(key)))

    # 只有叶子节点的文本是有效内容(至少在这个示例里是这样)
    if len(element) == 0:
        if element.text is not None and element.text.strip():
            data.append((element.tag, element.text.strip()))

    # 否则递归深入子元素,并将结果拼接到当前标签下
    else:
        for el in element:
            within = getDataRecursive(el)
            for key, value in within:
                data.append((element.tag + '.' + key, value))

    return data

# 获取所有数据
all_data = getDataRecursive(root)

# 创建Excel工作簿与工作表
wb = Workbook()
ws = wb.active
ws.title = "XML Data"

# 写入表头
ws.append(['Key', 'Value'])

# 打印并写入Excel数据
for key, value in all_data:
    print(f"{key} {value}")
    ws.append([key, value])

# 保存Excel文件
wb.save('output.xlsx')

内容的提问来源于stack exchange,提问作者praveen raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:35:15