Python根据指定文件生成XML的方法

作者:Surpassme 时间:2022-09-06 21:00:10 

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看。其原始文件默认使用逗号进行分隔,如下所示:

Python根据指定文件生成XML的方法

  • 第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效果如下所示:

Python根据指定文件生成XML的方法

    在LabelImg中的效果如下所示:

Python根据指定文件生成XML的方法

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
0
投稿

猜你喜欢

  • 如何让利用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
  • asp之家 网络编程 m.aspxhome.com