能否使用Python基于带间隔编号的CSV文件编辑XML文件?
从XML中筛选CSV指定编号的项目内容
我来帮你搞定这个需求!看起来你是想从那份包含连续编号的XML文件里,精准提取出CSV列表里那些带间隔的编号对应的项目描述对吧?下面我给你用Python写个实用的脚本,不需要额外装库,直接用标准模块就能搞定。
步骤说明
- 先把CSV里的目标编号全部读出来,存在一个集合里(集合查找比列表快很多,适合批量匹配)
- 解析XML文件,逐个检查每个
<item>节点的<unitd>编号是否在目标集合里 - 把匹配到的内容要么保存成新的XML,要么导出成CSV,看你需求
代码实现
import csv import xml.etree.ElementTree as ET # ---------------------- 配置文件路径 ---------------------- CSV_FILE_PATH = "your_target_ids.csv" XML_FILE_PATH = "your_source_data.xml" OUTPUT_XML_PATH = "matched_items.xml" OUTPUT_CSV_PATH = "matched_items.csv" # -------------------------------------------------------- # 读取CSV中的目标编号,处理每行单个或多个空格分隔的情况 target_ids = set() with open(CSV_FILE_PATH, 'r', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file) for row in csv_reader: # 把整行内容拼接成字符串再按空格分割,去掉空字符串 ids_in_row = [id_str.strip() for id_str in ' '.join(row).split() if id_str.strip()] target_ids.update(ids_in_row) # 解析XML并筛选匹配的项目 tree = ET.parse(XML_FILE_PATH) root = tree.getroot() matched_items = [] for item_node in root.findall('item'): unitd_node = item_node.find('unitd') # 确保节点存在且有文本内容 if unitd_node is not None and unitd_node.text is not None: current_id = unitd_node.text.strip() if current_id in target_ids: matched_items.append(item_node) # 保存匹配结果为新XML new_root = ET.Element('root') for item in matched_items: new_root.append(item) ET.ElementTree(new_root).write( OUTPUT_XML_PATH, encoding='utf-8', xml_declaration=True, method='xml' ) # 也可以导出成CSV格式(方便查看和编辑) with open(OUTPUT_CSV_PATH, 'w', newline='', encoding='utf-8') as csv_out: writer = csv.writer(csv_out) writer.writerow(['编号', '项目描述']) # 表头可以自定义 for item in matched_items: unitd = item.find('unitd').text.strip() unittitle = item.find('unittitle').text.strip() if item.find('unittitle').text else '无描述' writer.writerow([unitd, unittitle]) print(f"处理完成!匹配到{len(matched_items)}个项目,已保存到{OUTPUT_XML_PATH}和{OUTPUT_CSV_PATH}")
使用注意事项
- 把代码里的文件路径改成你自己的实际路径
- 如果CSV里是每行一个编号,代码也能正常处理;如果是一行多个用空格分隔,同样没问题
- 脚本会同时生成XML和CSV两种格式的结果,你可以根据需要删除其中一种输出逻辑
- 如果XML里的
<unitd>或<unittitle>节点可能不存在,代码里已经做了判断,避免报错
内容的提问来源于stack exchange,提问作者Cannedit
相关产品推荐
相关产品推荐

