如何用Python遍历XML文件并修改PASCALVOC标注的指定字段值
PASCAL VOC标注坐标批量放大实现方案
核心思路
使用Python标准库xml.etree.ElementTree遍历解析所有XML标注文件,定位bndbox节点下的坐标字段,完成数值放大后回写文件即可。
前置准备
操作前请先完整备份所有原始XML标注文件,避免修改错误导致数据丢失。
完整实现代码
import os import xml.etree.ElementTree as ET # 配置项,按需修改 XML_FOLDER = "./Annotations" # 替换为你的XML文件存放目录 SCALE_RATIO = 10 # 数值放大倍数 TARGET_FIELDS = ["xmin", "ymin", "xmax", "ymax"] # 需要修改的字段 # 遍历目录下所有XML文件 for file_name in os.listdir(XML_FOLDER): if not file_name.lower().endswith(".xml"): continue file_path = os.path.join(XML_FOLDER, file_name) # 解析XML文件 tree = ET.parse(file_path) root = tree.getroot() # 遍历所有bndbox节点(支持单文件多目标标注场景) for bndbox in root.iter("bndbox"): for field in TARGET_FIELDS: field_node = bndbox.find(field) if field_node is not None and field_node.text.strip(): # 读取原始数值,放大后重新赋值 original_val = int(field_node.text.strip()) field_node.text = str(original_val * SCALE_RATIO) # 保持XML缩进格式(Python 3.9及以上版本支持,低版本可注释该行) ET.indent(root, space="\t", level=0) # 回写修改后的XML文件 tree.write(file_path, encoding="utf-8", xml_declaration=True)
注意事项
- 如果你的标注坐标为浮点数,将代码中的
int替换为float即可 - 如果图像分辨率也同步放大了10倍,可新增代码修改
size节点下的width、height字段,逻辑和修改坐标一致 - Python 3.9以下版本没有
ET.indent()方法,注释该行即可,只是回写的XML没有格式化缩进,不影响正常读取使用
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

