XML文件处理技术求助:遍历XML并与同列名CSV合并建库(限标准库)
问题描述
我在处理XML文件时遇到困难,希望能打印XML文件以实现遍历操作。我的目标是将该XML文件与列名相同的CSV文件合并,之后用合并后的文件创建数据库,且不得使用非标准库。
现有代码及输出
代码
import xml.etree.ElementTree as ET xml_file = ET.parse("E:/Research work/My connect/Sam/CETM50 - 2022_3 - Assignment Data/user_data.xml") # 获取根标签 root = xml_file.getroot() # 打印第一个标签的属性 e = ET.tostring(xml_file.getroot(), encoding='unicode', method='xml') print(e)
输出
<user firstName="Jayne" lastName="Wilson" age="69" sex="Female" retired="False" dependants="1" marital_status="divorced" salary="36872" pension="0" company="Wall, Reed and Whitehouse" commute_distance="10.47" address_postcode="TD95 7FL">
解决方案(全标准库实现)
1. 遍历并提取XML数据
从输出可知,XML结构为根节点下包含多个<user>节点,每个节点的属性对应一条用户数据。以下代码可完整遍历并提取所有数据:
import xml.etree.ElementTree as ET # 解析XML文件 tree = ET.parse("user_data.xml") root = tree.getroot() # 提取所有用户数据为字典列表 xml_records = [] for user_node in root.findall('user'): xml_records.append(user_node.attrib)
2. 读取CSV文件
使用标准库csv读取CSV数据,同样转为字典列表格式:
import csv csv_records = [] # 替换为你的CSV文件路径 with open("user_data.csv", "r", encoding="utf-8") as csv_file: reader = csv.DictReader(csv_file) for row in reader: csv_records.append(row)
3. 合并XML与CSV数据
假设通过firstName和lastName作为唯一匹配键(可根据实际需求调整),合并两份数据:
# 构建CSV数据的索引字典,提升匹配效率 csv_index = {(row["firstName"], row["lastName"]): row for row in csv_records} merged_records = [] for xml_row in xml_records: match_key = (xml_row["firstName"], xml_row["lastName"]) if match_key in csv_index: # 合并字典,XML字段优先覆盖CSV(可根据需求调换顺序) merged_row = {**csv_index[match_key], **xml_row} merged_records.append(merged_row) else: # 无匹配的XML数据直接保留 merged_records.append(xml_row)
4. 创建SQLite数据库
使用标准库sqlite3创建数据库并插入合并后的数据:
import sqlite3 # 连接数据库(文件不存在则自动创建) conn = sqlite3.connect("user_database.db") cursor = conn.cursor() # 自动生成建表语句 if merged_records: columns = ", ".join([f"{col} TEXT" for col in merged_records[0].keys()]) create_table_sql = f"CREATE TABLE IF NOT EXISTS users ({columns})" cursor.execute(create_table_sql) # 批量插入数据 for record in merged_records: placeholders = ", ".join(["?"] * len(record)) insert_sql = f"INSERT INTO users ({', '.join(record.keys())}) VALUES ({placeholders})" cursor.execute(insert_sql, tuple(record.values())) # 提交更改并关闭连接 conn.commit() conn.close()
内容的提问来源于stack exchange,提问作者princewill
相关产品推荐
相关产品推荐

