如何使用Python将多个XML文件转换为CSV?附示例XML
把多个XML文件转换为CSV的Python实现
没问题,我来帮你搞定这个XML转CSV的需求!先看你的示例XML结构,里面包含了文本节点(比如<Task>、<comments>)和带属性的节点(<author>),我们需要把这些内容都映射到CSV的列里。下面给你两种实用的方案:
方案一:使用Python标准库(无额外依赖)
这个方案用xml.etree.ElementTree解析XML,csv模块写入文件,不需要安装任何第三方包,适合环境受限的场景。
代码实现
import xml.etree.ElementTree as ET import csv from pathlib import Path def parse_xml(xml_path): """解析单个XML文件,返回结构化数据""" tree = ET.parse(xml_path) root = tree.getroot() # 提取各个字段,兼容节点不存在的情况 task = root.find('Task').text.strip() if root.find('Task') is not None else "" author_node = root.find('author') author_test = author_node.get('Test') if author_node is not None else "" author_lang = author_node.get('lang') if author_node is not None else "" author_type = author_node.get('type') if author_node is not None else "" comments = root.find('comments').text.strip() if root.find('comments') is not None else "" return { "Task": task, "author_Test": author_test, "author_lang": author_lang, "author_type": author_type, "comments": comments } def xmls_to_csv(xml_dir, output_csv): """批量处理指定目录下的XML文件,写入CSV""" # 获取目录下所有XML文件 xml_files = list(Path(xml_dir).glob("*.xml")) if not xml_files: print("没有找到任何XML文件!") return # 准备CSV表头(和parse_xml返回的键对应) headers = ["Task", "author_Test", "author_lang", "author_type", "comments"] # 写入CSV with open(output_csv, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=headers) writer.writeheader() for xml_file in xml_files: print(f"正在处理: {xml_file.name}") data = parse_xml(xml_file) writer.writerow(data) print(f"转换完成!结果已保存到: {output_csv}") # 使用示例 if __name__ == "__main__": # 替换成你的XML文件所在目录 XML_DIRECTORY = "./xml_files" # 替换成你想要输出的CSV路径 OUTPUT_CSV = "./output.csv" xmls_to_csv(XML_DIRECTORY, OUTPUT_CSV)
代码说明
parse_xml函数:负责解析单个XML文件,提取我们需要的字段,同时处理节点可能不存在的情况,避免运行报错。xmls_to_csv函数:批量遍历指定目录下的所有XML文件,调用解析函数收集数据,然后统一写入CSV。Path.glob用来匹配所有.xml文件,比手动遍历目录更简洁可靠。
方案二:使用Pandas(代码更简洁)
如果你已经安装了pandas,这个方案会更省心,pandas.read_xml可以直接处理XML结构,然后一行代码就能转成CSV。
代码实现
import pandas as pd from pathlib import Path def xmls_to_csv_pandas(xml_dir, output_csv): """用Pandas批量转换XML到CSV""" xml_files = list(Path(xml_dir).glob("*.xml")) if not xml_files: print("没有找到任何XML文件!") return # 遍历所有XML文件,读取并合并成一个DataFrame df_list = [] for xml_file in xml_files: print(f"正在处理: {xml_file.name}") # 读取XML,指定xpath定位数据节点,给属性加前缀避免列名冲突 df = pd.read_xml( xml_file, xpath="./document", attrs_prefix="author_" ) df_list.append(df) # 合并所有数据并写入CSV combined_df = pd.concat(df_list, ignore_index=True) combined_df.to_csv(output_csv, index=False, encoding='utf-8') print(f"转换完成!结果已保存到: {output_csv}") # 使用示例 if __name__ == "__main__": XML_DIRECTORY = "./xml_files" OUTPUT_CSV = "./output_pandas.csv" xmls_to_csv_pandas(XML_DIRECTORY, OUTPUT_CSV)
代码说明
pd.read_xml的xpath参数指定读取<document>节点下的内容,精准定位我们需要的数据。attrs_prefix参数会给<author>节点的属性自动添加前缀(比如Test变成author_Test),和方案一的列名保持一致,避免列名冲突。- 最后用
pd.concat合并所有XML的数据,一次性写入CSV,代码量少且易维护。
注意事项
- 如果你的XML文件结构和示例有差异,只需要修改解析部分的代码(比如新增节点提取、调整属性名称)即可适配。
- 如果XML文件编码不是UTF-8,需要在解析时指定对应的编码(比如方案一中的
ET.parse(xml_path, parser=ET.XMLParser(encoding='GBK')))。
内容的提问来源于stack exchange,提问作者Kum_R
相关产品推荐
相关产品推荐

