在深度学习中的样本,xml文件中记录着图片的各种信息。现在图片更改了,所以需要对应地修改xml中的数据。
①读取图片的尺寸信息
②修改对应的xml,将真实尺寸修改
要修改的xml
<annotation>
<folder>doublefolder>
<filename>0001filename>
<path>C:\Users\Think\Desktop\asd\double\0001.jpgpath>
<source>
<database>Unknowndatabase>
source>
<size>
<width>474width>
<height>790height>
<depth>3depth>
size>
<segmented>0segmented>
<object>
<name>1name>
<pose>Unspecifiedpose>
<truncated>0truncated>
<difficult>0difficult>
<bndbox>
<xmin>272xmin>
<ymin>229ymin>
<xmax>424xmax>
<ymax>486ymax>
bndbox>
object>
开始
from PIL import Image
导入Image模块,获取图片信息
img = Image.open(pic_path)
imgSize = img.size
pic_height = max(imgSize)
pic_width = min(imgSize)
修改xml节点信息,需要
from xml.etree.ElementTree import ElementTree,Element
然后解析xml
tree = ElementTree().parse(xml_path)#解析xml文件路径,注意 ElementTree后面一定要加(),不然会报错
node1=tree.find('./size/width')#在解析完成的tree中查找width子节点
node1.text = str(pic_width)#将图片中的宽度信息更新在xml中,注意这里要转换成str类型
node2 = tree.find('./size/height')#在解析完成的tree中查找height子节点
node2.text = str(pic_height)#注意这里要转换成str类型
注意:
到这里之后还没完,这样修改之后并不是直接将原xml文件修改了。一定要执行保存操作生成新xml文件
tree.write(out_path, encoding="utf-8", xml_declaration=True)#如果要直接再原xml上进行修改,直接将 #out_path改成原来的路径即可。
后来在网上看到一个博主总结的特别好,所以搬过来了
http://blog.csdn.net/wklken/article/details/7603071
from xml.etree.ElementTree import ElementTree,Element
def read_xml(in_path):
'''读取并解析xml文件
in_path: xml路径
return: ElementTree'''
tree = ElementTree()
tree.parse(in_path)
return tree
def write_xml(tree, out_path):
'''将xml文件写出
tree: xml树
out_path: 写出路径'''
tree.write(out_path, encoding="utf-8", xml_declaration=True)
def if_match(node, kv_map):
'''判断某个节点是否包含所有传入参数属性
node: 节点
kv_map: 属性及属性值组成的map'''
for key in kv_map:
if node.get(key) != kv_map.get(key):
return False
return True
# ---------------search -----
def find_nodes(tree, path):
'''查找某个路径匹配的所有节点
tree: xml树
path: 节点路径'''
return tree.findall(path)
def get_node_by_keyvalue(nodelist, kv_map):
'''根据属性及属性值定位符合的节点,返回节点
nodelist: 节点列表
kv_map: 匹配属性及属性值map'''
result_nodes = []
for node in nodelist:
if if_match(node, kv_map):
result_nodes.append(node)
return result_nodes
# ---------------change -----
def change_node_properties(nodelist, kv_map, is_delete=False):
'''修改/增加 /删除 节点的属性及属性值
nodelist: 节点列表
kv_map:属性及属性值map'''
for node in nodelist:
for key in kv_map:
if is_delete:
if key in node.attrib:
del node.attrib[key]
else:
node.set(key, kv_map.get(key))
def change_node_text(nodelist, text, is_add=False, is_delete=False):
'''改变/增加/删除一个节点的文本
nodelist:节点列表
text : 更新后的文本'''
for node in nodelist:
if is_add:
node.text += text
elif is_delete:
node.text = ""
else:
node.text = text
def create_node(tag, property_map, content):
'''新造一个节点
tag:节点标签
property_map:属性及属性值map
content: 节点闭合标签里的文本内容
return 新节点'''
element = Element(tag, property_map)
element.text = content
return element
def add_child_node(nodelist, element):
'''给一个节点添加子节点
nodelist: 节点列表
element: 子节点'''
for node in nodelist:
node.append(element)
def del_node_by_tagkeyvalue(nodelist, tag, kv_map):
'''同过属性及属性值定位一个节点,并删除之
nodelist: 父节点列表
tag:子节点标签
kv_map: 属性及属性值列表'''
for parent_node in nodelist:
children = parent_node.getchildren()
for child in children:
if child.tag == tag and if_match(child, kv_map):
parent_node.remove(child)