python文件操作之xml转txt

 在使用yolo进行深度学习训练时,我们所使用的标签文件都是txt格式的,但是有的人使用的标注软件生成的可能是xml文件,那么就需要使用python工具写一个格式转换脚本。

首先导入库,并定义标注的图片地址、生成的标签文件xml地址、存储结果txt的地址。

import cv2
import os
import math
import xml.dom.minidompath_img = r'/home/pc/下载/qq_file/test/img/'
path_xml = r'/home/pc/下载/qq_file/test/xml/'
path_txt = r'/home/pc/下载/qq_file/test/txt/'

files = os.listdir(path_xml)这句话的files存储了path_xml路径下的所有xml文件

if __name__ == "__main__":files = os.listdir(path_xml)print("文件数量: " + str(len(files)))for file in files:print(file)

如上代码的file打印结果就应该为目标文件夹下所有xml文件的文件名,如246.xml。

if __name__ == "__main__":files = os.listdir(path_xml)print("文件数量: " + str(len(files)))for file in files:print(file)xmlname = file.split('.')txtname = xmlname[0] + '.txt'imgname = xmlname[0] + '.jpg'txtpath = path_txt + txtnameimgpath = path_img + imgnamexmlpath = path_xml + xmlname[0] + '.' + xmlname[1]

接下来用“ . ”来分割xml文件的文件名和后缀,其中xmlname[0] = 文件名,xmlname[1] = xml。由此可以定义每一个xml、txt、jpg的路径。

if __name__ == "__main__":files = os.listdir(path_xml)print("文件数量: " + str(len(files)))for file in files:print(file)xmlname = file.split('.')txtname = xmlname[0] + '.txt'imgname = xmlname[0] + '.jpg'txtpath = path_txt + txtnameimgpath = path_img + imgnamexmlpath = path_xml + xmlname[0] + '.' + xmlname[1]# print(xmlpath)file_txt = open(txtpath, 'w+')frame = cv2.imread(imgpath)pixel_size = frame.shape[0]print(pixel_size)

接下来定义file_txt为文件夹下每一个txt文件,并可进行write操作。

# 将解析xml文件的结果存在dom变量下dom = xml.dom.minidom.parse(xmlpath)# 获取xml文件的根元素root = dom.documentElementobjects = root.getElementsByTagName('object')for obj in objects:name = obj.getElementsByTagName('name')[0]  # [0]可能代表包含标签数值的一个集合(这里可能包含标签数值,地址等)if name.childNodes[0].data == 'armor_red':  # 通过调用name.childNodes[0].data方法获取标签数值file_txt.write('0 ')elif name.childNodes[0].data == 'full_red':file_txt.write('1 ')elif name.childNodes[0].data == 'R_red':file_txt.write('2 ')else:print(file + ":label error")robodbox = obj.getElementsByTagName('robodbox')cx = obj.getElementsByTagName('cx')[0]cy = obj.getElementsByTagName('cy')[0]w = obj.getElementsByTagName('w')[0]h = obj.getElementsByTagName('h')[0]angle = obj.getElementsByTagName('angle')[0]# print(f"cx = {cx.childNodes[0]}, cy = {cy.childNodes[0].data}, w = {w.childNodes[0].data}, h = {h.childNodes[0].data}, "#       f"angle = {angle.childNodes[0].data}")temp_cx = str(float(cx.childNodes[0].data) / pixel_size)temp_cy = str(float(cy.childNodes[0].data) / pixel_size)temp_h = str(float(h.childNodes[0].data) / pixel_size)temp_w = str(float(w.childNodes[0].data) / pixel_size)temp_angle = str(float(angle.childNodes[0].data) / math.pi*180)

接下来对xml文件进行解析,调用dom = xml.dom.minidom.parse(xmlpath),将解析xml文件的结果存在dom变量下;root = dom.documentElement,获取xml文件的根元素root;objects = root.getElementsByTagName('object'),获得object;使用for循环遍历每一个object,使用name = obj.getElementsByTagName('name')[0]来获得每一个object的name,这里[0]可能代表包含标签数值的一个集合(这里可能包含标签数值,地址等),然后判断

if name.childNodes[0].data == 'armor_red'

file_txt.write('0 ')

通过调用name.childNodes[0].data方法获取标签数值,写入txt文件作为第一个数值,即“类别“。

            robodbox = obj.getElementsByTagName('robodbox')cx = obj.getElementsByTagName('cx')[0]cy = obj.getElementsByTagName('cy')[0]w = obj.getElementsByTagName('w')[0]h = obj.getElementsByTagName('h')[0]angle = obj.getElementsByTagName('angle')[0]# print(f"cx = {cx.childNodes[0]}, cy = {cy.childNodes[0].data}, w = {w.childNodes[0].data}, h = {h.childNodes[0].data}, "#       f"angle = {angle.childNodes[0].data}")temp_cx = str(float(cx.childNodes[0].data) / pixel_size)temp_cy = str(float(cy.childNodes[0].data) / pixel_size)temp_h = str(float(h.childNodes[0].data) / pixel_size)temp_w = str(float(w.childNodes[0].data) / pixel_size)temp_angle = str(float(angle.childNodes[0].data) / math.pi*180)file_txt.write(temp_cx + ' ')file_txt.write(temp_cy + ' ')file_txt.write(temp_w + ' ')file_txt.write(temp_h + ' ')file_txt.write(temp_angle + ' ')file_txt.write('\n')

类别信息获取后,接下来对矩形框数值进行解析,使用同样的方法获取数据,并进行归一化写入txt。

完整代码如下

import cv2
import os
import math
import xml.dom.minidompath_img = r'/home/pc/下载/qq_file/test/img/'
path_xml = r'/home/pc/下载/qq_file/test/xml/'
path_txt = r'/home/pc/下载/qq_file/test/txt/'if __name__ == "__main__":files = os.listdir(path_xml)print("文件数量: " + str(len(files)))for file in files:print(file)xmlname = file.split('.')txtname = xmlname[0] + '.txt'imgname = xmlname[0] + '.jpg'txtpath = path_txt + txtnameimgpath = path_img + imgnamexmlpath = path_xml + xmlname[0] + '.' + xmlname[1]# print(xmlpath)file_txt = open(txtpath, 'w+')frame = cv2.imread(imgpath)pixel_size = frame.shape[0]# print(pixel_size)# 将解析xml文件的结果存在dom变量下dom = xml.dom.minidom.parse(xmlpath)# 获取xml文件的根元素root = dom.documentElementobjects = root.getElementsByTagName('object')for obj in objects:name = obj.getElementsByTagName('name')[0]  # [0]可能代表包含标签数值的一个集合(这里可能包含标签数值,地址等)if name.childNodes[0].data == 'armor_red':  # 通过调用name.childNodes[0].data方法获取标签数值file_txt.write('0 ')elif name.childNodes[0].data == 'full_red':file_txt.write('1 ')elif name.childNodes[0].data == 'R_red':file_txt.write('2 ')else:print(file + ":label error")robodbox = obj.getElementsByTagName('robodbox')cx = obj.getElementsByTagName('cx')[0]cy = obj.getElementsByTagName('cy')[0]w = obj.getElementsByTagName('w')[0]h = obj.getElementsByTagName('h')[0]angle = obj.getElementsByTagName('angle')[0]# print(f"cx = {cx.childNodes[0]}, cy = {cy.childNodes[0].data}, w = {w.childNodes[0].data}, h = {h.childNodes[0].data}, "#       f"angle = {angle.childNodes[0].data}")temp_cx = str(float(cx.childNodes[0].data) / pixel_size)temp_cy = str(float(cy.childNodes[0].data) / pixel_size)temp_h = str(float(h.childNodes[0].data) / pixel_size)temp_w = str(float(w.childNodes[0].data) / pixel_size)temp_angle = str(float(angle.childNodes[0].data) / math.pi*180)file_txt.write(temp_cx + ' ')file_txt.write(temp_cy + ' ')file_txt.write(temp_w + ' ')file_txt.write(temp_h + ' ')file_txt.write(temp_angle + ' ')file_txt.write('\n')print("ok")file_txt.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot使用EhCache完成一个缓存集群

在上一篇在SpringBoot中使用EhCache缓存,我们完成了在Spring Boot中完成了对EhCaChe的使用,这篇,我们将对EhCache的进一步了解,也就是搭建一个EhCache的缓存集群。 集群 在搭建一个EhCache的时候,我们需要先了解&…

2023-11-17 VsCode使用makefile进行多文件编译

点击 <C 语言编程核心突破> 快速C语言入门 VsCode使用makefile进行多文件编译 前言一、一个简单的多文件示例二、makefile基本语法三、VsCode使用makefile总结 前言 要解决问题: C或C可以多文件编译, 意味着需要进行代码组织, 为了方便多文件编译, gnu开发了make工具, …

2018年五一杯数学建模A题徐州潘安湖风景区游览路线设计解题全过程文档及程序

2019年五一杯数学建模 A题 徐州潘安湖风景区游览路线设计 原题再现 徐州是一个老工业基地和资源型城市&#xff0c;煤炭开采历史长达130年。长期煤炭开采在徐州累计形成采煤塌陷区达数十万亩。位于徐州市贾汪区西南部、紧邻马庄的潘安湖湿地公园原来就是徐州最大的、塌陷最严…

实验六:Android的网络编程基础

实验六&#xff1a;Android 的网络编程基础 6.1 实验目的 本次实验的目的是让大家熟悉 Android 开发中的如何获取天气预报&#xff0c;包括了 解和熟悉 WebView、WebService 使用、网络编程事件处理等内容。 6.2 实验要求 熟悉和掌握 WebView 使用 了解 Android 的网络编程…

Hadoop学习总结(MapRdeuce的词频统计)

MapRdeuce编程示例——词频统计 一、MapRdeuce的词频统计的过程 二、编程过程 1、Mapper 组件 WordcountMapper.java package com.itcast.mrdemo;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; …

网站页头被挂马状态及新增了index.html文件解决思路

今天网站刚新增了篇了文章《从nginx层阻断可执行的php 防止宝塔站点挂马》,整体测试下来还是不靠谱,设置后导致所有PHP文件都打不开了。 经过不断的查看日志和搜索办法总算告一段落,后续待观察。原因如下,多个网站目录新增了index.html文件,看时间是近两天上传的。 网站代…

微信小程序动态生成表单来啦!你再也不需要手写表单了!

dc-vant-form 由于我们在小程序上涉及到数据采集业务&#xff0c;需要经常使用表单&#xff0c;微信小程序的表单使用起来非常麻烦&#xff0c;数据和表单是分离的&#xff0c;每个输入框都需要做数据处理才能实现响应式数据&#xff0c;所以我开发了dc-vant-form&#xff0c;…

【开源】基于Vue.js的社区买菜系统的设计和实现

项目编号&#xff1a; S 011 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S011&#xff0c;文末获取源码。} 项目编号&#xff1a;S011&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1…

【uniapp】 video视频层级、遮挡其他弹窗或顶部导航 使用nvue覆盖

uniapp 顶部导航和弹窗被video遮挡解决办法 第一步&#xff1a;配置 subNVues {"path": "pages/index/index","style": {"navigationBarTitleText": "uni-app","navigationStyle": "custom","app-…

对话芯动科技 | 助力云游戏 4K级服务器显卡的探索与创新

2021年芯动科技推出了基于IMG BXT GPU IP的风华1号显卡。单块风华1号显卡可在台式机和云游戏中实现4K级别的性能&#xff0c;渲染能力达到5 TFLOPS&#xff0c;如果在服务器中同时运行两块显卡&#xff0c;性能还可翻倍。该显卡是为不断扩大的安卓云游戏市场量身定制的&#xf…

隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态

2023年11月 NearCon2023 活动期间&#xff0c;基于 Cosmos SDK 构建的隐私协议 Secret Network&#xff0c;宣布使用 Octopus Network 开发的 NEAR-IBC&#xff0c;于2024年第一季度实现 Secret Network 与 NEAR Protocol 之间的跨链交互。 这将会是Cosmos 生态与 NEAR 之间的首…

GZ033 大数据应用开发赛题第04套

2023年全国职业院校技能大赛 赛题第04套 赛项名称&#xff1a; 大数据应用开发 英文名称&#xff1a; Big Data Application Development 赛项组别&#xff1a; 高等职业教育组 赛项编号&#xff1a; GZ033 …

[C国演义] 哈希的使用和开闭散列的模拟实现

哈希的使用和开闭散列的模拟实现 1. 使用1.1 unordered_map的接口1.2 unordered_set的接口 2. 哈希底层2.1 概念2.2 解决哈希冲突 3. 实现3.1 开放寻址法3.2 拉链法 1. 使用 1.1 unordered_map的接口 构造 void test1() {// 空的unordered_map对象unordered_map<int, in…

动态头像如何制作?这个方法请收藏

照片是记录生活的一种方式&#xff0c;但是静态图片有时候不能够完全表达我们的情感。而动态的图片能够让图片以更生动的方式来展示我们的想象力和内心情感。那么&#xff0c;大家知道动态图片制作的方法有哪些吗&#xff1f;使用gif动画制作&#xff08;https://www.gif.cn/&a…

React项目首页中用canvas实现星空

文章目录 前言代码使用后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;感谢大家…

Element UI之Checkbox 多选框

Checkbox 多选框 在一组选项中进行多选 按需引入方式 如果是完整引入可跳过此步骤 import Vue from vue import { Checkbox, CheckboxGroup } from element-ui import element-ui/lib/theme-chalk/base.css import element-ui/lib/theme-chalk/checkbox.css import element…

两个macos命令

ldd替代: otool -L strace替代: sudo dtruss

机器学习笔记 - 隐马尔可夫模型的简述

隐马尔可夫模型是一个并不复杂的数学模型,到目前为止,它一直被认为是解决大多数自然语言处理问题最为快速、有效的方法。它成功地解决了复杂的语音识别、机器翻译等问题。看完这些复杂的问题是如何通过简单的模型得到描述和解决,我们会由衷地感叹数学模型之妙。 人类信息交流…

数据结构与算法设计分析——常用搜索算法

目录 一、穷举搜索二、图的遍历算法&#xff08;一&#xff09;深度优先搜索&#xff08;DFS&#xff09;&#xff08;二&#xff09;广度优先搜索&#xff08;BFS&#xff09; 三、回溯法&#xff08;一&#xff09;回溯法的定义&#xff08;二&#xff09;回溯法的应用 四、分…