【Python--XML文件读写】XML文件读写详解
【Python–XML文件读写】XML文件读写详解
文章目录
- 【Python--XML文件读写】XML文件读写详解
- 1. 前言
- 1.1 介绍
- 1.2 用法
- 2. xml文件内容形式
- 3. xml文件读写
- 3.1 项目框架
- 3.1 写入操作(创建)(create_xml.py)
- 3.2 读取操作(解析)(read_xml.py)
- 4. 参考
1. 前言
1.1 介绍
XML 指可扩展标记语言XML ,常被设计用来传输和存储数据。
XML 是一种固有的分层数据格式,最自然的表示方式是使用树。 ET为此有两个类 - ElementTree将整个 XML 文档表示为一棵树,并 Element表示该树中的单个节点。与整个文档的交互(从文件读取和写入/从文件写入)通常在ElementTree级别上完成。与单个 XML 元素及其子元素的交互是在Element级别上完成的。
其内元素称作子节点通过 parse() 解析xml文本,返回根元素 tree。(一级节点Annotation) 通过对 tree 进行findall操作,可到到带有指定标签的节点(二级节点eg:filename,object)。
1.2 用法
xml.etree.ElementTree模块实现了用于解析和创建 XML 数据的简单高效的 API。 Element对象有以下常用属性:
- tag: 标签
- findall() : 只找到带有标签的 所有节点
- append() : 增加新节点
- set():增加或者修改属性
- text: 去除标签,获得标签中的内容。
- attrib: 获取标签中的属性和属性值。
- remove():删除节点
- 保存xml文件: ElementTree.write()
2. xml文件内容形式
3. xml文件读写
3.1 项目框架
3.1 写入操作(创建)(create_xml.py)
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import ElementTree
from xml.dom import minidom'''
生成对应的label, 也就是xml文件
'''# 该函数使xml文件更加美观,也就是换行和缩进
def prettyXml(element, indent, newline, level = 0):'''参数:elemnt为传进来的Elment类;indent用于缩进;newline用于换行;'''# 判断element是否有子元素if element:# 如果element的text没有内容 if element.text == None or element.text.isspace(): element.text = newline + indent * (level + 1) else: element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1) # 此处两行如果把注释去掉,Element的text也会另起一行 #else: #element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level temp = list(element) # 将elemnt转成list for subelement in temp: # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致if temp.index(subelement) < (len(temp) - 1): subelement.tail = newline + indent * (level + 1)else: # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个 subelement.tail = newline + indent * level # 对子元素进行递归操作 prettyXml(subelement, indent, newline, level = level + 1)def create(root_dir, img_name, bg_size, count, tg_loca):'''root_dir: 要写到得文件夹下img_name: 对应样本的文件名bg_size: 图片的大小 (w, h)count: 目标的个数tg_loca: 裂缝目标的位置 list[(x_tl, y_tl, x_br, y_br)]'''# 1 annotationannotation = Element('annotation')# 1-1 filenamefilename = SubElement(annotation, 'filename')filename.text = img_name# 1-2 object_countobject_count = SubElement(annotation, 'object_count')object_count.text = str(count)# 1-3 size# -------------------size start--------------------------size = SubElement(annotation, 'size')# 1-3-1 widthwidth = SubElement(size, 'width')width.text = str(bg_size[0])# 1-3-2 heightheight = SubElement(size, 'height')height.text = str(bg_size[1])# 1-3-3 depthdepth = SubElement(size, 'depth')depth.text = '1'# -------------------size end--------------------------# 1-4 segmentedsegmented = SubElement(annotation, 'segmented')segmented.text = '0'# 1-(5 : 5 + count) objectfor i in range(0, count):object = SubElement(annotation, 'object')# 1-(:)-1 namename = SubElement(object, 'name')name.text = 'Crack'# 1-(:)-2 posepose = SubElement(object, 'pose')pose.text = 'Unspecified'# 1-(:)-3 truncatedtruncated = SubElement(object, 'truncated')truncated.text = str(i)# 1-(:)-4 difficultdifficult = SubElement(object, 'difficult')difficult.text = '0'# 1-(:)-5 bndbox# ---------------------bndbox start------------------------------bndbox = SubElement(object, 'bndbox')# xminxmin = SubElement(bndbox, 'xmin')xmin.text = str(tg_loca[i][0])# yminymin = SubElement(bndbox, 'ymin')ymin.text = str(tg_loca[i][1])# xmaxxmax = SubElement(bndbox, 'xmax')xmax.text = str(tg_loca[i][2])# ymaxymax = SubElement(bndbox, 'ymax')ymax.text = str(tg_loca[i][3])# ---------------------bndbox end------------------------------tree = ElementTree(annotation)root = tree.getroot() prettyXml(root, '\t', '\n')# write out xml datatree.write(root_dir + img_name + '.xml', encoding = 'utf-8')root_dir = "./"
img_name = 'img.jpg'
bg_size = (1024, 1024)
count = 2
tg_loca = [(12, 12, 512, 512), (12, 513, 1000, 1000)]create(root_dir, img_name, bg_size, count, tg_loca)
- 得到的xml文件如下:
3.2 读取操作(解析)(read_xml.py)
import xml.etree.ElementTree as ET
import os
from PIL import Image, ImageDraw, ImageFontdef parse_rec(pic_path, filename):"""解析xml"""tree = ET.parse(filename) # 解析读取xml函数objects = []coordinate = []for xml_name in tree.findall('filename'):img_path = os.path.join(pic_path, xml_name.text)for obj in tree.findall('object'):obj_struct = {'name': obj.find('name').text, 'pose': obj.find('pose').text,'truncated': int(obj.find('truncated').text), 'difficult': int(obj.find('difficult').text)}bbox = obj.find('bndbox')obj_struct['bbox'] = [int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)]objects.append(obj_struct)for obj_one in objects:xmin = int(obj_one['bbox'][0])ymin = int(obj_one['bbox'][1])xmax = int(obj_one['bbox'][2])ymax = int(obj_one['bbox'][3])label = obj_one['name']coordinate.append([xmin,ymin,xmax,ymax,label])return coordinate, img_pathdef visualise_gt(objects, img_path, now_path):img = Image.open(img_path)draw = ImageDraw.ImageDraw(img)for obj in objects:xmin = obj[0]ymin = obj[1]xmax = obj[2]ymax = obj[3]label = obj[4]draw.rectangle(((xmin, ymin), (xmax, ymax)), fill=None, outline="white")draw.text((xmin + 10, ymin), label, "blue")img.save(now_path)if __name__ == "__main__":# 图片路径pic_path = "."# xml文件路径xml_path = "./img.jpg.xml"# 解析后存放地址now_path = "./img_now.jpg"# obj_context:返回一个含有所有标注的信息,img_dir:原始图片路径obj_context, img_path = parse_rec(pic_path, xml_path)visualise_gt(obj_context, img_path, now_path)
-
原图:(img.jpg)
-
解析后的图:(img_now.jpg)
4. 参考
【1】https://blog.csdn.net/qq_48764574/article/details/122052510
相关文章:

【Python--XML文件读写】XML文件读写详解
【Python–XML文件读写】XML文件读写详解 文章目录【Python--XML文件读写】XML文件读写详解1. 前言1.1 介绍1.2 用法2. xml文件内容形式3. xml文件读写3.1 项目框架3.1 写入操作(创建)(create_xml.py)3.2 读取操作(解析…...

GNU make 中文手册 第一二章 概述与介绍
一、第一章:概述 准备知识 在开始我们关于 make 的讨论之前,首先需要明确一些基本概念: 编译:把高级语言书写的代码,转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能…...
真的了解HashMap、HashSet吗?做一道测试题试试!
本人博客《HashMap、HashSet底层原理分析》,可以了解hashmap的底层源码实现 测试代码 HashSet底层实际就是一个Hashmap。猜猜下面源码每一个打印结果。 注:user对象重写的hashcode方法,保证name和age一样的情况下hashcode是一样的ÿ…...

树莓派下安装OpenEuler
openEuler作为华为开源的应用于嵌入式设备的操作系统,正在受到越来越多的关注。树莓派是一个很好的应用场景,这篇文章就介绍下如何在树莓派上安装openEuler。 ps:openEuler要求树莓派的版本是4B 1.下载openEuler镜像 镜像网址࿱…...

VSCode Remote-SSH配置免密登录踩坑
VSCode Remote-SSH配置免密登录踩坑1. 参考2. 基本流程2.1 机器A(Windows客户端)2.2 机器B(Linux服务器)2.3 机器A(Windows客户端)的VSCode设置3. 踩坑总结相关教程很多,但要么冗余,…...
【Python语言基础】——Python NumPy 数组拆分
Python语言基础——Python NumPy 数组拆分 文章目录 Python语言基础——Python NumPy 数组拆分一、Python NumPy 数组拆分一、Python NumPy 数组拆分 拆分 NumPy 数组 拆分是连接的反向操作。 连接(Joining)是将多个数组合并为一个,拆分(Spliting)将一个数组拆分为多个。…...

虹科资讯| 虹科AR荣获汽车后市场“20佳”维修工具评委会提名奖!
2022 虹科荣获20佳维修工具 评委会提名奖 特大喜讯,在2月16日《汽车维修与保养》杂志主办的第十八届汽车后市场“20佳”评选活动中,虹科的产品“M400智能AR眼镜”凭借在AR领域的专业实力,通过层层筛选,在102款入围产品中脱颖而出…...

Mysql架构与内部模块
Mysql架构与内部模块 演示环境: MySQL 5.7 存储引擎:InnoDB 一、一条查询SQL是如何执行的? 程序或者工具要操作数据库,第一步跟数据库建立连接。 1、通信协议 首先,MySQL 必须要运行一个服务,监听默认的…...

从技术上来看,互联网技术开始衍生和蜕变出更多的新技术
很多人在看待产业互联网的问题上,一味地割裂它与互联网之间的联系,甚至还有人将产业互联网看成是对于传统互联网的颠覆。如果仅仅只是以这样的眼光来看待产业互联网,那么,他们势必是无法完整把握产业互联网的本质内涵和原始奥义的…...
最长不含重复字符的子字符串
今天处理一道算法题目,《剑指Offer》第48题,力扣中等题。 这道题也是面试的高频题! 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例1: 输入: "abcabcbb" …...

git中git push origin master推送远程操作失败,报错解决方案
报错图片如下所示: 解决方案: 使用下面代码进行本地与远程仓库的链接: git remote add origin http://xxxxx///xxx(https://gitee.com/peach-fog/shopping-cart-car-warehouse.git)链接完成之后就会输出:fatal: remote origin already exists. 链接完成之后就需要使用git br…...

服务器部署流程与经验记录
服务器部署流程1.项目部署1.1 重置实例密码1.2 配置安全组规则1.3 远程连接服务器1.4 安装所需软件1.5 安装Tomcat1.6 配置宝塔安全组1.7 导入数据库和项目2. 域名注册3. 网站备案1.项目部署 1.1 重置实例密码 1.2 配置安全组规则 1.3 远程连接服务器 使用VNC远程连接&#…...
超火的情感视频短视频账号,赚钱的路子有多野?
目录 一、情感类视频内容模式 1、线上情感导师型 2、用动画传达人生哲理 3、网抑云式的野生“文案馆” 4、星座式情感账号 二、情感号变现方式 1、首先是可以接广告 2、收徒做情感号培训,知识付费 3、导流粉丝到公众号 4、通过卖号来变现 6、导流微信变现…...

Linux系列 linux 常用命令(笔记)
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.linux 常用命令(目录文和件基本操作) 1.命令的分类…...

Cosmos 基础教程(二)-- Run a Node, API, and CLI
有很多不同的方法来运行Cosmos区块链的节点。您将探索如何使用simapp 进行此操作。 1、编译simapp Cosmos SDK存储库包含一个名为 simapp 的文件夹。在这个文件夹中,您可以找到运行Cosmos SDK模拟版本的代码,这样您就可以在不实际与链交互的情况下测试…...
C# 读写xml文件总结 [详细]
C# 读写xml文件总结C#写入xml文件1、XmlDocument2、DataSet对象里的值来生成XML文件3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。示例:写入xml1、创建xml文档2 、增加节点3 、修改节点:4 、删除节点c#读取xml文件C#写入xml文件 1、XmlDo…...

【Java基础】IO流
IO流 最后一定要关闭流,防止资源泄露 字节流 一次读取1字节,8比特 FileInputStream import org.junit.jupiter.api.Test;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class CopyBytes {pub…...
Boolean,Array,Object数据类型(回顾)
Boolean数据类型范围Boolean(value)Object数据类型特点键值对数组特点类数组特点 Boolean数据类型范围 true,false 链接 Boolean(value) 定义:其他类型转布尔类型 六大假值:false,undefined,null,NaN,0…...
Python常见的数据类型
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
欠缺知识点罗列
UML五种关系的特点 依赖,关联,组合,聚合,泛化。认识UML类关系——依赖、关联、聚合、组合、泛化 - 腾讯云开发者社区-腾讯云 数据结构- 生成树的定义。 每周学点大数据 | No.17最小生成树 - 腾讯云开发者社区-腾讯云 有向图。 …...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...