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

python xml的读取和写入

import xml.etree.ElementTree as ET
from xml.dom import minidom# 读取XML文档
tree = ET.parse("./xml_3/z_20240827_001.xml")
root = tree.getroot()
# 获取size元素
size_find_0 = root.find("size")
# 获取width子元素
size_w = size_find_0.find("width")
# 获取元素中的文本
print(size_w.text)# xml里面有多个 object 元素
# 查找 object 元素的全部
objects = root.findall('object')
for object_find_0 in objects:# print('Tag:', child.tag)# print('Text:', child.text)# print('Attributes:', child.attrib)# 获取 object 元素的子元素nameclass_name = object_find_0.find("name")print(class_name.text)# 写入
# 保存
# 创建根元素
root = ET.Element("annotation")folder_save = ET.SubElement(root, "folder")
folder_save.text = "f"# 创建子元素
size_save = ET.SubElement(root, "size")
# 创建二级子元素 只需输入参数不同即可
size_w_save = ET.SubElement(size_save, "width")size_w_save.text = "需要写入的内容"with open("./name_i.xml", 'w', encoding='utf-8') as xml_file:# 将 XML 元素树转换为字节串,编码为 utf-8rough_string = ET.tostring(root, 'utf-8')# 使用 minidom 模块解析生成的字节串,得到一个可操作的 XML 对象reparsed = minidom.parseString(rough_string)# 将重新解析后的 XML 对象转换为格式打印(pretty-print)的字符串形式,# 其中 indent="  "表示使用两个空格作为缩进string_ = reparsed.toprettyxml(indent="  ")xml_file.write(string_)

xml 标注文件的拆分与合并

目的是方便检测单类别标注的正确性
例子:将xml拆分多个xml文件

import xml.etree.ElementTree as ET
import os
from xml.dom import minidom# 全部类别
list_class = ['A1', 'A2', 'A3']
# xml标签路径 (绝对路径)
path_lab = "E:/lab/"# 拆分保存xml的路径 (绝对路径)
save_xml_path = "E:/lab/ce/"for xml_name in os.listdir(path_lab):# xml_name = 'Camera12_20231001_30.xml'# 1. 读取XML文档tree = ET.parse(path_lab + xml_name)root = tree.getroot()# 存储 字典dict_class = {}for i in list_class:dict_class[i] = []# 创建单个文件夹folder_name = save_xml_path + "/" + i + "/"if not os.path.exists(folder_name):os.mkdir(folder_name)#     print(f"文件夹 '{folder_name}' 创建成功。")# else:#     print(f"文件夹 '{folder_name}' 已存在。")# for i, j in dict_class.items():#     print(i, j)size_find_0 = root.find("size")size_w = size_find_0.find("width")size_h = size_find_0.find("height")size_d = size_find_0.find("depth")## print(size_w.text)# print(size_h.text)# print(size_d.text)# 分离文件名 与 文件后缀name_lab, xml_ = os.path.splitext(xml_name)folder_jpg = root.find("folder")# print(folder_jpg.text)path_jpg = root.find("path")# print(path_jpg.text)filename_jpg = root.find("filename")# print(filename_jpg.text)# 2. 查找 object 全部objects = root.findall('object')for object_find_0 in objects:# print('Tag:', child.tag)# print('Text:', child.text)# print('Attributes:', child.attrib)class_name = object_find_0.find("name")class_bndbox = object_find_0.find("bndbox")class_bndbox_xmin = class_bndbox.find("xmin")class_bndbox_ymin = class_bndbox.find("ymin")class_bndbox_xmax = class_bndbox.find("xmax")class_bndbox_ymax = class_bndbox.find("ymax")# print(class_name.text)# print(class_bndbox_xmin.text)# print(class_bndbox_ymin.text)# print(class_bndbox_xmax.text)# print(class_bndbox_ymax.text)dict_class[class_name.text].append((class_name.text,class_bndbox_xmin.text,class_bndbox_ymin.text,class_bndbox_xmax.text,class_bndbox_ymax.text,))for ob_class, ob_list in dict_class.items():# 创建根元素root = ET.Element("annotation")folder_save = ET.SubElement(root, "folder")folder_save.text = folder_jpg.textfilename_jpg_save = ET.SubElement(root, "filename")filename_jpg_save.text = filename_jpg.textpath_save_xml = ET.SubElement(root, "path")path_save_xml.text = path_jpg.text# 创建子元素size_save = ET.SubElement(root, "size")# 创建二级子元素 只需输入参数不同即可size_w_save = ET.SubElement(size_save, "width")size_w_save.text = size_w.textsize_h_save = ET.SubElement(size_save, "height")size_h_save.text = size_h.textsize_d_save = ET.SubElement(size_save, "depth")size_d_save.text = size_d.textfor ob_list_i in ob_list:object_save = ET.SubElement(root, "object")name_save = ET.SubElement(object_save, "name")name_save.text = str(ob_list_i[0])bndbox_save = ET.SubElement(object_save, "bndbox")xmin_save = ET.SubElement(bndbox_save, "xmin")xmin_save.text = str(ob_list_i[1])ymin_save = ET.SubElement(bndbox_save, "ymin")ymin_save.text = str(ob_list_i[2])xmax_save = ET.SubElement(bndbox_save, "xmax")xmax_save.text = str(ob_list_i[3])ymax_save = ET.SubElement(bndbox_save, "ymax")ymax_save.text = str(ob_list_i[4])# 写入文件if len(dict_class[ob_class]) != 0:if ob_class in list_class:path_save_i = save_xml_path + "/" + ob_class + "/" + xml_nameprint(path_save_i)# tree.write(path_save_i, encoding="utf-8", xml_declaration=True)with open(path_save_i, 'w', encoding='utf-8') as xml_file:# 将 XML 元素树转换为字节串,编码为 utf-8rough_string = ET.tostring(root, 'utf-8')# 使用 minidom 模块解析生成的字节串,得到一个可操作的 XML 对象reparsed = minidom.parseString(rough_string)# 将重新解析后的 XML 对象转换为格式打印(pretty-print)的字符串形式,# 其中 indent="  "表示使用两个空格作为缩进string_ = reparsed.toprettyxml(indent="  ")xml_file.write(string_)

将拆分的xml合并为1个

import xml.etree.ElementTree as ET
import os
from xml.dom import minidom# 合并和拆分的类别要一致
list_class = ['A1', 'A2', 'A3'']
# 标注图片路径
path_img = "E:/zyk_lab/ce/img/"
# xml 拆分的总路径
path_lab = "E:/zyk_lab/ce/ce/"
# xml 合并后保存的路径
path_lab_save = "E:/zyk_lab/ce/lab_ce/"for img_name in os.listdir(path_img):# img_name = "Camera12_20231001_31"img_name = os.path.splitext(img_name)[0]dict_class = {}for i in list_class:dict_class[i] = []dict_class["width"] = 0dict_class["height"] = 0dict_class["depth"] = 0dict_class["folder"] = "null"dict_class["path"] = "null"dict_class["filename"] = "null"for file_1 in os.listdir(path_lab):path_i = os.path.join(path_lab, file_1)for xml_name in os.listdir(path_i):if img_name == os.path.splitext(xml_name)[0]:# 1. 读取XML文档xml_path = os.path.join(path_i, xml_name)tree = ET.parse(xml_path)root = tree.getroot()size_find_0 = root.find("size")size_w = size_find_0.find("width").textsize_h = size_find_0.find("height").textsize_d = size_find_0.find("depth").textfolder_jpg = root.find("folder").text# print(folder_jpg.text)path_jpg = root.find("path").text# print(path_jpg.text)filename_jpg = root.find("filename").text# print(filename_jpg.text)dict_class["width"] = size_wdict_class["height"] = size_hdict_class["depth"] = size_ddict_class["folder"] = folder_jpgdict_class["path"] = path_jpgdict_class["filename"] = filename_jpg# 2. 查找 object 全部objects = root.findall('object')for object_find_0 in objects:# print('Tag:', child.tag)# print('Text:', child.text)# print('Attributes:', child.attrib)class_name = object_find_0.find("name")class_bndbox = object_find_0.find("bndbox")class_bndbox_xmin = class_bndbox.find("xmin")class_bndbox_ymin = class_bndbox.find("ymin")class_bndbox_xmax = class_bndbox.find("xmax")class_bndbox_ymax = class_bndbox.find("ymax")# print(class_name.text)# print(class_bndbox_xmin.text)# print(class_bndbox_ymin.text)# print(class_bndbox_xmax.text)# print(class_bndbox_ymax.text)dict_class[class_name.text].append((class_name.text,class_bndbox_xmin.text,class_bndbox_ymin.text,class_bndbox_xmax.text,class_bndbox_ymax.text,))# 保存# 创建根元素root = ET.Element("annotation")folder_save = ET.SubElement(root, "folder")if dict_class["folder"] != "null":folder_save.text = dict_class["folder"]filename_jpg_save = ET.SubElement(root, "filename")if dict_class["filename"] != "null":filename_jpg_save.text = dict_class["filename"]path_save_xml = ET.SubElement(root, "path")if dict_class["path"] != "null":path_save_xml.text = dict_class["path"]# 创建子元素size_save = ET.SubElement(root, "size")# 创建二级子元素 只需输入参数不同即可size_w_save = ET.SubElement(size_save, "width")if dict_class["width"] != "null":size_w_save.text = dict_class["width"]size_h_save = ET.SubElement(size_save, "height")if dict_class["height"] != "null":size_h_save.text = dict_class["height"]size_d_save = ET.SubElement(size_save, "depth")if dict_class["depth"] != "null":size_d_save.text = dict_class["depth"]for ob_class, ob_list in dict_class.items():print(ob_class, ob_list)# 跳过你不需要写入的元素if ob_class in ["元素1", "元素2"]:continuefor ob_list_i in ob_list:# print(ob_list_i)object_save = ET.SubElement(root, "object")name_save = ET.SubElement(object_save, "name")name_save.text = str(ob_list_i[0])bndbox_save = ET.SubElement(object_save, "bndbox")xmin_save = ET.SubElement(bndbox_save, "xmin")xmin_save.text = str(ob_list_i[1])ymin_save = ET.SubElement(bndbox_save, "ymin")ymin_save.text = str(ob_list_i[2])xmax_save = ET.SubElement(bndbox_save, "xmax")xmax_save.text = str(ob_list_i[3])ymax_save = ET.SubElement(bndbox_save, "ymax")ymax_save.text = str(ob_list_i[4])# 写入文件# if len(dict_class[ob_class]) != 0:#     if ob_class in list_class:path_save_i = path_lab_save + img_name + ".xml"print(path_save_i)# tree.write(path_save_i, encoding="utf-8", xml_declaration=True)with open(path_save_i, 'w', encoding='utf-8') as xml_file:# 将 XML 元素树转换为字节串,编码为 utf-8rough_string = ET.tostring(root, 'utf-8')# 使用 minidom 模块解析生成的字节串,得到一个可操作的 XML 对象reparsed = minidom.parseString(rough_string)# 将重新解析后的 XML 对象转换为格式打印(pretty-print)的字符串形式,# 其中 indent="  "表示使用两个空格作为缩进string_ = reparsed.toprettyxml(indent="  ")xml_file.write(string_)

相关文章:

python xml的读取和写入

import xml.etree.ElementTree as ET from xml.dom import minidom# 读取XML文档 tree ET.parse("./xml_3/z_20240827_001.xml") root tree.getroot() # 获取size元素 size_find_0 root.find("size") # 获取width子元素 size_w size_find_0.find("…...

WebGL 小白入门学习

1. WebGL是什么? WebGL(Web Graphics Library)是一种JavaScript API,它允许你在不需要安装任何额外插件的情况下,直接在浏览器中渲染高性能的2D和3D图形。WebGL利用了用户的图形处理单元(GPU)来…...

OSI七层协议

OSI(Open System Interconnection)七层协议,即开放式系统互联参考模型,是一个由国际标准化组织(ISO)提出的用于描述计算机网络中通信的结构和功能的理论模型。它将网络通信过程分为七个层次,每个…...

超平面(Hyperplane)和半空间(Halfspace)

文章目录 一、超平面(Hyperplane)1. 定义2. 超平面的方程3. 例子4. 超平面的性质 二、半空间(Halfspace)1. 定义2. 半空间的表示3. 半空间的性质 三、超平面与半空间的关系四、应用1. 线性规划2. 机器学习3. 计算几何4. 凸分析 五…...

TCP(Transmission Control Protocol,传输控制协议)整理

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输协议,它是OSI(Open System Interconnection,开放式系统互联)模型中的第四层协议,通常使用于网络中的…...

R语言绘制线性回归图

线性回归图以二维坐标系展示两个变量关系。数据点代表实际观测值,核心是线性回归线。此线通过统计方法确定,与数据点距离平方和最小。它反映变量间线性趋势,斜率正负决定相关方向。可用于预测因变量值,也能进行推断统计。在数据分…...

C++进阶:map和set的使用

目录 一.序列式容器和关联式容器 二.set系列的使用 2.1set容器的介绍 2.2set的构造和迭代器 2.3set的增删查 2.4insert和迭代器遍历的样例 2.5find和erase的样例 ​编辑 2.6multiset和set的差异 2.7简单用set解决两道题 两个数组的交集 环形链表二 三.map系列的使用…...

深入理解C++ STL中的 vector

文章目录 1. vector 的概述1.1 vector 是什么?1.2 vector 的优点1.3 vector 的缺点 2. vector 的基本使用2.1 vector 的定义2.2 基本操作2.3 示例2.4 迭代器的使用 3. vector 的内部实现原理3.1 动态数组的实现3.2 内存管理3.3 内存扩展策略3.4 元素的插入与删除3.4…...

MySQL 安装与配置详细教程

MySQL 安装与配置详细教程 MySQL 是一款流行的关系型数据库管理系统,广泛应用于 Web 应用和应用程序中。在本文中,我们将提供一份详细的 MySQL 安装与配置教程,帮助初学者快速上手。 ## 1. 安装 MySQL 首先,我们需要从 MySQL 官…...

理解智能合约:区块链在Web3中的运作机制

随着区块链技术的不断发展,“智能合约”这一概念变得越来越重要。智能合约是区块链应用的核心之一,正在推动Web3的发展,为数字世界带来了前所未有的自动化和信任机制。本文将深入探讨智能合约的基本原理、运作机制,以及它在Web3生…...

QT工程概述

在Qt中,创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围: MainWindow:这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复 杂的应用程序,需要这些额外的用户…...

redis安装 | 远程连接

1.redis的安装 在Ubuntu下安装redis【网址】使用root账号使用apt来安装。使用apt安装比较的方便,但是安装的版本可能就不是最新的版本。 $ su root $ apt list --installed | grep redis # 查看是否安装 $ apt search redis # 查看apt中的redis版本 $ apt install…...

性价比高的宠物空气净化器应该怎么挑?有哪几款推荐?

前几年和朋友住在一起之后就一起养了两只猫,没想到刚开始还好,到后期之后,我和朋友都苦不堪言,有泪都流不出。 主要是猫咪掉毛实在是太严重了,下班回去之后,发现朋友在打扫家里,又是擦又是扫的…...

Golang | Leetcode Golang题解之第466题统计重复个数

题目&#xff1a; 题解&#xff1a; func getMaxRepetitions(s1 string, n1 int, s2 string, n2 int) int {n : len(s2)cnt : make([]int, n)for i : 0; i < n; i {// 如果重新给一个s1 并且s2是从第i位开始匹配 那么s2可以走多少位&#xff08;走完了就从头开始走p1, p2 :…...

设计模式 - 行为模式

行为模式 观察者模式&#xff0c;策略模式&#xff0c;命令模式&#xff0c;中介者模式&#xff0c;备忘录模式&#xff0c;模板方法模式&#xff0c;迭代器模式&#xff0c;状态模式&#xff0c;责任链模式&#xff0c;解释器模式&#xff0c;访问者模式 保存/封装 行为/请求…...

InstructGPT的四阶段:预训练、有监督微调、奖励建模、强化学习涉及到的公式解读

1. 预训练 1. 语言建模目标函数&#xff08;公式1&#xff09;&#xff1a; L 1 ( U ) ∑ i log ⁡ P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_1(\mathcal{U}) \sum_{i} \log P(u_i \mid u_{i-k}, \dots, u_{i-1}; \Theta) L1​(U)i∑​logP(ui​∣ui−k​,…,ui−1​;Θ…...

没有HTTPS 证书时,像这样实现多路复用

在没有 HTTPS 证书的情况下,HTTP/2 通常不能直接通过 HTTP 协议使用。虽然 HTTP/2 协议的规范是可以支持纯 HTTP 连接(即通过 http:// 协议),但大多数主流浏览器(如 Chrome、Firefox)都 强制要求 HTTP/2 必须在 HTTPS 上运行。这是出于安全和隐私的考虑。 因此,如果你没…...

2.1.ReactOS系统NtReadFile函数的实现。

ReactOS系统NtReadFile函数的实现。 ReactOS系统NtReadFile函数的实现。 文章目录 ReactOS系统NtReadFile函数的实现。NtReadFile函数的定义NtReadFile函数的实现 NtReadFile()是windows的一个系统调用&#xff0c;内核中有一个叫NtReadFile的函数 NtReadFile函数的定义 NTS…...

2020-11-06《04丨人工智能时代,新的职业机会在哪里?》

《香帅中国财富报告25讲》 04丨人工智能时代&#xff0c;新的职业机会在哪里&#xff1f; 1、新机会的三个诞生方向 前两讲我们都在说&#xff0c;人工智能的出现会极大地冲击现有的职业&#xff0c;从2020年开始&#xff0c;未来一二十年&#xff0c;可能有一半以上的职业都会…...

TensorRT-LLM七日谈 Day5

模型加载 在day2, 我们尝试了对于llama8B进行转换和推理&#xff0c;可惜最后因为OOM而失败&#xff0c;在day4,我们详细的过了一遍tinyllama的推理&#xff0c;值得注意的是&#xff0c;这两个模型的推理走的是不同的流程。llama8b需要显式的进行模型的转换&#xff0c;引擎的…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...