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
相关产品推荐
相关产品推荐

