如何用Python将CSV转换为嵌套结构XML(无需Pandas)
CSV转嵌套XML的Python实现(无Pandas)
实现思路
- 先按
id字段对CSV数据分组,把同一id对应的所有地址信息聚合到一起 - 基于分组后的数据生成XML,每个id对应一个
<address>父节点,其下嵌套该id的所有地址条目
示例CSV内容
假设你的输入CSV文件input.csv内容如下:
id,addr_type,street,city 1,home,Main St,New York 1,work,Office Rd,Chicago 2,home,Park Ave,Los Angeles
修改后的代码
import csv from collections import defaultdict # 第一步:按id分组地址数据 address_groups = defaultdict(list) with open('input.csv', 'r', encoding='utf-8') as csv_file: csv_reader = csv.DictReader(csv_file) for row in csv_reader: # 提取当前行的id,剩余字段作为地址详情 current_id = row.pop('id') address_groups[current_id].append(row) # 第二步:生成嵌套XML with open('output.xml', 'w', encoding='utf-8') as xml_file: xml_file.write('<?xml version="1.0" encoding="UTF-8"?>\n') xml_file.write('<root>\n') for record_id, addresses in address_groups.items(): # 写入id对应的父address节点 xml_file.write(f' <address id="{record_id}">\n') # 写入该id下的所有地址条目 for addr in addresses: xml_file.write(' <address_entry>\n') for field, value in addr.items(): xml_file.write(f' <{field}>{value}</{field}>\n') xml_file.write(' </address_entry>\n') xml_file.write(' </address>\n') xml_file.write('</root>')
生成的XML结果
运行代码后,output.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <address id="1"> <address_entry> <addr_type>home</addr_type> <street>Main St</street> <city>New York</city> </address_entry> <address_entry> <addr_type>work</addr_type> <street>Office Rd</street> <city>Chicago</city> </address_entry> </address> <address id="2"> <address_entry> <addr_type>home</addr_type> <street>Park Ave</street> <city>Los Angeles</city> </address_entry> </address> </root>
关键说明
- 使用
collections.defaultdict简化分组逻辑,无需手动判断id是否已存在于字典中 - 先读取所有CSV数据并分组,再写入XML,确保同一id的所有地址都被聚合到同一个父节点下
- 代码兼容CSV字段扩展,新增字段时无需修改XML生成逻辑
- 添加了XML声明头,保证编码格式规范
内容的提问来源于stack exchange,提问作者Mr Peanutbutter
相关产品推荐
相关产品推荐

