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


Posted in Python onJune 29, 2020

    因项目需要根据指定格式的文件生成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.3water.com/code/xmljson

在线格式化XML/在线压缩XML:
http://tools.3water.com/code/xmlformat

XML在线压缩/格式化工具:
http://tools.3water.com/code/xml_format_compress

XML代码在线格式化美化工具:
http://tools.3water.com/code/xmlcodeformat

对关于Python生成XML相关内容感兴趣的读者可查看本站专题:《Python操作xml数据技巧总结》

以上就是Python根据指定文件生成XML的方法的详细内容,更多关于Python生成XML的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python抓取Discuz!用户名脚本代码
Dec 30 Python
python学习笔记:字典的使用示例详解
Jun 13 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
Jan 14 Python
详解Python匿名函数(lambda函数)
Apr 19 Python
Python列表的切片实例讲解
Aug 20 Python
Python-opencv 双线性插值实例
Jan 17 Python
Python基于httpx模块实现发送请求
Jul 07 Python
python按照list中字典的某key去重的示例代码
Oct 13 Python
Python 操作SQLite数据库的示例
Oct 16 Python
python中pickle模块浅析
Dec 29 Python
4种非常实用的python内置数据结构
Apr 28 Python
keras在构建LSTM模型时对变长序列的处理操作
Jun 29 #Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 #Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 #Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 #Python
如何使用python记录室友的抖音在线时间
Jun 29 #Python
Python sublime安装及配置过程详解
Jun 29 #Python
keras K.function获取某层的输出操作
Jun 29 #Python
You might like
UCenter Home二次开发指南
2009/05/28 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
php与js的区别是什么
2013/08/05 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
Android面试题附答案
2014/12/08 面试题
预备党员的自我评价
2014/03/12 职场文书
实验室标语
2014/06/21 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
工作试用期自我评价
2015/03/10 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
python 对图片进行简单的处理
2021/06/23 Python
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android