当前位置: 首页 > news >正文

【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 写入操作&#xff08;创建&#xff09;&#xff08;create_xml.py&#xff09;3.2 读取操作&#xff08;解析…...

GNU make 中文手册 第一二章 概述与介绍

一、第一章&#xff1a;概述 准备知识 在开始我们关于 make 的讨论之前&#xff0c;首先需要明确一些基本概念&#xff1a; 编译&#xff1a;把高级语言书写的代码&#xff0c;转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别&#xff0c;但是还不能…...

真的了解HashMap、HashSet吗?做一道测试题试试!

本人博客《HashMap、HashSet底层原理分析》&#xff0c;可以了解hashmap的底层源码实现 测试代码 HashSet底层实际就是一个Hashmap。猜猜下面源码每一个打印结果。 注&#xff1a;user对象重写的hashcode方法&#xff0c;保证name和age一样的情况下hashcode是一样的&#xff…...

树莓派下安装OpenEuler

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

VSCode Remote-SSH配置免密登录踩坑

VSCode Remote-SSH配置免密登录踩坑1. 参考2. 基本流程2.1 机器A&#xff08;Windows客户端&#xff09;2.2 机器B&#xff08;Linux服务器&#xff09;2.3 机器A&#xff08;Windows客户端&#xff09;的VSCode设置3. 踩坑总结相关教程很多&#xff0c;但要么冗余&#xff0c;…...

【Python语言基础】——Python NumPy 数组拆分

Python语言基础——Python NumPy 数组拆分 文章目录 Python语言基础——Python NumPy 数组拆分一、Python NumPy 数组拆分一、Python NumPy 数组拆分 拆分 NumPy 数组 拆分是连接的反向操作。 连接(Joining)是将多个数组合并为一个,拆分(Spliting)将一个数组拆分为多个。…...

虹科资讯| 虹科AR荣获汽车后市场“20佳”维修工具评委会提名奖!

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

Mysql架构与内部模块

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

从技术上来看,互联网技术开始衍生和蜕变出更多的新技术

很多人在看待产业互联网的问题上&#xff0c;一味地割裂它与互联网之间的联系&#xff0c;甚至还有人将产业互联网看成是对于传统互联网的颠覆。如果仅仅只是以这样的眼光来看待产业互联网&#xff0c;那么&#xff0c;他们势必是无法完整把握产业互联网的本质内涵和原始奥义的…...

最长不含重复字符的子字符串

今天处理一道算法题目&#xff0c;《剑指Offer》第48题&#xff0c;力扣中等题。 这道题也是面试的高频题&#xff01; 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串&#xff0c;计算该最长子字符串的长度。 示例1&#xff1a; 输入: "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、收徒做情感号培训&#xff0c;知识付费 3、导流粉丝到公众号 4、通过卖号来变现 6、导流微信变现…...

Linux系列 linux 常用命令(笔记)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.linux 常用命令&#xff08;目录文和件基本操作&#xff09; 1.命令的分类…...

Cosmos 基础教程(二)-- Run a Node, API, and CLI

有很多不同的方法来运行Cosmos区块链的节点。您将探索如何使用simapp 进行此操作。 1、编译simapp Cosmos SDK存储库包含一个名为 simapp 的文件夹。在这个文件夹中&#xff0c;您可以找到运行Cosmos SDK模拟版本的代码&#xff0c;这样您就可以在不实际与链交互的情况下测试…...

C# 读写xml文件总结 [详细]

C# 读写xml文件总结C#写入xml文件1、XmlDocument2、DataSet对象里的值来生成XML文件3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。示例&#xff1a;写入xml1、创建xml文档2 、增加节点3 、修改节点&#xff1a;4 、删除节点c#读取xml文件C#写入xml文件 1、XmlDo…...

【Java基础】IO流

IO流 最后一定要关闭流&#xff0c;防止资源泄露 字节流 一次读取1字节&#xff0c;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) 定义&#xff1a;其他类型转布尔类型 六大假值&#xff1a;false&#xff0c;undefined&#xff0c;null&#xff0c;NaN&#xff0c;0…...

Python常见的数据类型

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

欠缺知识点罗列

UML五种关系的特点 依赖&#xff0c;关联&#xff0c;组合&#xff0c;聚合&#xff0c;泛化。认识UML类关系——依赖、关联、聚合、组合、泛化 - 腾讯云开发者社区-腾讯云 数据结构- 生成树的定义。 每周学点大数据 | No.17最小生成树 - 腾讯云开发者社区-腾讯云 有向图。 …...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

基于 TAPD 进行项目管理

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

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...