Python根据指定文件生成XML的方法
作者:Surpassme 时间:2022-09-06 21:00:10
因项目需要根据指定格式的文件生成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 error\n{ex}")
return
if __name__ == '__main__':
srcPath = r"C:\Users\Surpass\Documents\PycharmProjects\data\TEST-8\outs"
srcName = "locations.txt"
targetPath = r"C:\Users\Surpass\Documents\PycharmProjects\data\TEST-8\outs\in_number"
operateXML = OpeateXML(srcPath, targetPath, srcName)
a = operateXML.readSrcFileName()
operateXML.createXML(a)
最终生成的XML效果如下所示:
在LabelImg中的效果如下所示:
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson
在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat
XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress
XML代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat
对关于Python生成XML相关内容感兴趣的读者可查看本站专题:《Python操作xml数据技巧总结》
来源:https://www.cnblogs.com/surpassme/p/13204899.html
标签:Python,生成,XML


猜你喜欢
如何让利用Python+AI使静态图片动起来
2022-06-06 08:15:31

python代码实现备忘录案例讲解
2021-09-15 02:19:15
C#简单连接sql数据库的方法
2024-01-14 09:01:27
解决 myJSFrame 框架中 Ajax 方法一处明显的内存泄露
2008-03-09 19:14:00
Python开发之快速搭建自动回复微信公众号功能
2022-06-27 03:08:04

Python全局变量与局部变量区别及用法分析
2021-01-24 07:35:21
解决tensorflow由于未初始化变量而导致的错误问题
2023-06-05 17:44:05
xhtml+css VS div+css
2008-04-07 13:00:00
JSP实现客户信息管理系统
2023-06-30 05:32:36

Python中字符串类型代码的执行函数——eval()、exec()和compile()详解
2022-07-08 09:14:12
python统计日志ip访问数的方法
2023-07-05 18:57:20
php flv视频时间获取函数
2023-09-04 13:41:48
Python任务自动化工具tox使用教程
2022-08-28 12:33:58

PyCharm 2020.2下配置Anaconda环境的方法步骤
2022-10-08 14:25:00

SQLServer2019安装教程图文详解
2024-01-24 10:09:13

深入理解Python中装饰器的用法
2022-04-25 18:59:31
我跟iframe之间的误会
2008-03-17 13:30:00
Golang 限流器的使用和实现示例
2024-04-25 15:06:25
Python抓取通过Ajax加载数据的示例
2023-12-09 21:28:38
Win10系统下安装编辑器之神(The God of Editor)Vim并且构建Python生态开发环境过程(2020年最新攻略)
2021-11-24 05:20:30
