Python根据指定文件生成XML的方法
时间:2022-07-27
本文章向大家介绍Python根据指定文件生成XML的方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看。其原始文件默认使用逗号进行分隔,如下所示:
- 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表原始图片的第几个切图文件
- 第2~5值:分别对应于ymin, xmin, ymax, xmax
- 第6个值:代表对应的标签标注
在生成XML文件时,需要对其进行汇总,即将属于同一个原始文件的切图小文件的标注汇总到一起,其实现代码如下所示:
import os
from Logger import MyLogger
from xml.dom.minidom import Document
from collections import defaultdict
import re
class OpeateXML:
def __init__(self, srcPath: str, targetPath: str, srcFileName: str):
self._srcPath = srcPath
self._targetPath = targetPath
self._srcFileName = srcFileName
def readSrcFileName(self, fileEncoding="utf8") - dict:
data = defaultdict(list)
s = re.compile(".AIpng_d{1,}", re.IGNORECASE)
srcFileFullPath = os.path.join(self._srcPath, self._srcFileName)
try:
with open(srcFileFullPath, mode="r", encoding=fileEncoding, errors="ignore") as fr:
for content in fr.readlines():
data[s.sub(".AIpng",content.strip().split(",")[0])].append(content.strip())
except Exception as ex:
MyLogger().error(f"OperateXML:read file error:n{ex}")
return {}
else:
# data.sort(key=lambda x: x.strip().split(",")[0])
return data
def createXML(self, data: dict, fileEncoding="utf8"):
if data:
try:
for k,v in data.items():
doc = Document()
# 创建根节点
rootNode = doc.createElement("annotation")
# 添加根节点
doc.appendChild(rootNode)
folder = doc.createElement("folder")
folderText = doc.createTextNode(self._targetPath)
folder.appendChild(folderText)
rootNode.appendChild(folder)
filename = doc.createElement("filename")
filenameText = doc.createTextNode(k)
filename.appendChild(filenameText)
rootNode.appendChild(filename)
path = doc.createElement("path")
pathText = doc.createTextNode(os.path.join(self._targetPath,k))
path.appendChild(pathText)
rootNode.appendChild(path)
for i in v:
tmpData = i.strip().split(",")
if len(tmpData) == 6:
_, ymin, xmin, ymax, xmax, labelName = tmpData
objectObj = doc.createElement("object")
rootNode.appendChild(objectObj)
objectName = doc.createElement("name")
objectNameText = doc.createTextNode(labelName)
objectName.appendChild(objectNameText)
objectObj.appendChild(objectName)
objectBndBox = doc.createElement("bndbox")
objectObj.appendChild(objectBndBox)
objectBndBoxXmin = doc.createElement("xmin")
objectBndBoxYmin = doc.createElement("ymin")
objectBndBoxXmax = doc.createElement("xmax")
objectBndBoxYmax = doc.createElement("ymax")
objectBndBoxXminText = doc.createTextNode(xmin)
objectBndBoxYminText = doc.createTextNode(ymin)
objectBndBoxXmaxText = doc.createTextNode(xmax)
objectBndBoxYmaxText = doc.createTextNode(ymax)
objectBndBox.appendChild(objectBndBoxXmin)
objectBndBox.appendChild(objectBndBoxYmin)
objectBndBox.appendChild(objectBndBoxXmax)
objectBndBox.appendChild(objectBndBoxYmax)
objectBndBoxXmin.appendChild(objectBndBoxXminText)
objectBndBoxYmin.appendChild(objectBndBoxYminText)
objectBndBoxXmax.appendChild(objectBndBoxXmaxText)
objectBndBoxYmax.appendChild(objectBndBoxYmaxText)
objectObj.appendChild(objectBndBox)
else:
continue
# save xml
xmlName=os.path.splitext(k)[0]+".xml"
targetPath = os.path.join(self._targetPath, xmlName)
with open(targetPath, mode="w", encoding=fileEncoding) as fw:
doc.writexml(fw, indent="t", newl="n", addindent="t", encoding=fileEncoding)
except Exception as ex:
MyLogger().error(f"OperateXML:Save xml errorn{ex}")
return
if __name__ == '__main__':
srcPath = r"C:UsersSurpassDocumentsPycharmProjectsdataTEST-8outs"
srcName = "locations.txt"
targetPath = r"C:UsersSurpassDocumentsPycharmProjectsdataTEST-8outsin_number"
operateXML = OpeateXML(srcPath, targetPath, srcName)
a = operateXML.readSrcFileName()
operateXML.createXML(a)
最终生成的XML效果如下所示:
在LabelImg中的效果如下所示:
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具: http://tools.zalou.cn/code/xmljson
在线格式化XML/在线压缩XML: http://tools.zalou.cn/code/xmlformat
XML在线压缩/格式化工具: http://tools.zalou.cn/code/xml_format_compress
XML代码在线格式化美化工具: http://tools.zalou.cn/code/xmlcodeformat
以上就是Python根据指定文件生成XML的方法的详细内容,更多关于Python生成XML的资料请关注ZaLou.Cn其它相关文章!
- Django之ORM其他骚操作
- Centos 7下 FTP 服务器
- Django之views系统
- Brackets
- django之urls系统
- 最长公共子序列(稀疏序列)nlogn解法
- P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)
- PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获(下)
- 3002 石子归并 3
- day2 oracle相关
- P2946 [USACO09MAR]牛飞盘队Cow Frisbee Team
- Django 中间件
- jupyter notebook下mongodb的使用
- P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 新的Spring OAuth2.0 授权服务器项目正式发布
- spring boot整合apollo
- 枚举和List的几个共有方法
- AtomicInteger源码解析
- AtomicIntegerArray源码解析
- AtomicIntegerFieldUpdater源码解析
- “终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
- 一些PHP选项参数相关的函数
- 【Flutter 专题】98 易忽略的【小而巧】的技术点汇总 (六)
- PHP脚本设置及获取进程名
- GlasgowSmile-v2通关笔记
- R语言实现输出文本的多样式
- 学习|Unity3d的导航实现循环线路移动
- 【redis】闲得无聊,来聊聊当下爆火的 redis集群,顺便搭一个玩玩呗
- 【redis入门】Centos下安装redis