当前位置: 首页 > 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最小生成树 - 腾讯云开发者社区-腾讯云 有向图。 …...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...