【工具脚本】读取VOC格式的标注xml文件,并修改xml中的内容
程序员文章站
2022-04-17 21:22:03
...
功能:读取xml文件,并根据需求修改里面的内容。
1)修改xml文件中标注框的xmin,xmax,ymin,ymax的坐标值,当坐标值越界时,对其进行修改。
2)修改xml中filename的值(即标注文件对应图片的名称)。
注意:使用python3运行,python2运行时会报错(encoding相关的).
# coding=utf-8
import os
import os.path
import xml.dom.minidom
# 将string转换为int
def to_int(str):
try:
int(str)
return int(str)
except ValueError: #报类型错误,说明不是整型的
try:
float(str) #用这个来验证,是不是浮点字符串
return int(float(str))
except ValueError: #如果报错,说明即不是浮点,也不是int字符串。 是一个真正的字符串
return False
root = r"/data_1/样本" #根目录路径
path = root + '/xml' #输入文件夹
save_path = root + '/newxml' #输出文件夹
if not os.path.isdir(save_path):
os.makedirs(save_path)
files = os.listdir(path) # 得到文件夹下所有r文件名称
s = []
for xmlFile in files:
# 遍历文件夹
portion = os.path.splitext(xmlFile)
if not os.path.isdir(xmlFile):
# 判断是否是文件夹,不是文件夹才打开
print (xmlFile)
# xml文件读取操作
# 将获取的xml文件名送入到dom解析
dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))
# 最核心的部分os.path.join(path,xmlFile),路径拼接,输入的是具体路径
root = dom.documentElement
# 修改xmin
xmin = root.getElementsByTagName('xmin')
for i in range(len(xmin)):
if to_int(xmin[i].firstChild.data) < 0:
xmin[i].firstChild.data = 0
print(">>>>>>>>>>>>>>>>>>>xmin修改为:"+str(xmin[i].firstChild.data))
# 修改ymin
ymin = root.getElementsByTagName('ymin')
for i in range(len(ymin)):
if to_int(ymin[i].firstChild.data) < 0:
ymin[i].firstChild.data = 0
print(">>>>>>>>>>>>>>>>>>>ymin修改为:"+str(ymin[i].firstChild.data))
# 获取图像的宽高
width = 0
height = 0
img_w = root.getElementsByTagName('width')
for i in range(len(img_w)):
width = to_int(img_w[i].firstChild.data)
img_h = root.getElementsByTagName('height')
for i in range(len(img_h)):
height = to_int(img_h[i].firstChild.data)
# 修改xmax
xmax = root.getElementsByTagName('xmax')
for i in range(len(xmax)):
if to_int(xmax[i].firstChild.data) > width:
xmax[i].firstChild.data = width
print(">>>>>>>>>>>>>>>>>>>xmax修改为"+str(xmax[i].firstChild.data))
# 修改ymax
ymax = root.getElementsByTagName('ymax')
for i in range(len(ymax)):
if to_int(ymax[i].firstChild.data) > height:
ymax[i].firstChild.data = height
print(">>>>>>>>>>>>>>>>>>>ymax修改为:"+str(ymax[i].firstChild.data))
# # 修改图像的尺寸
# if width > height:
# for i in range(len(img_h)):
# img_h[i].firstChild.data = width
# elif width < height:
# for i in range(len(img_w)):
# img_w[i].firstChild.data = height
# else:
# print("need not alter!")
# 保存修改到xml文件中
with open(os.path.join(save_path, xmlFile), 'w', encoding='UTF-8') as fh:
dom.writexml(fh)
print('process...')
# name = root.getElementsByTagName('name')
# # pose=root.getElementsByTagName('pose')
# # 重命名class name
# for i in range(len(name)):
# # print (name[i].firstChild.data)
# # print(xmlFile)
# # if portion[1] == ".xml":
# # newname = portion[0] + ".jpg"
# # print(newname)
# newname = "zero"
# if name[i].firstChild.data == "chebiao":
# name[i].firstChild.data = newname
# print(name[i].firstChild.data)