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展示动态规则法用以解决重叠子问题的示例
Apr 02 Python
Python 探针的实现原理
Apr 23 Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 Python
django之常用命令详解
Jun 30 Python
Python表示矩阵的方法分析
May 26 Python
对python多线程与global变量详解
Nov 09 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
python如何控制进程或者线程的个数
Oct 16 Python
pytorch 权重weight 与 梯度grad 可视化操作
Jun 05 Python
Python实现单例模式的5种方法
Jun 15 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
PHP学习之数组值的操作
2011/04/17 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
教师自我鉴定
2013/12/13 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
鼋头渚导游词
2015/02/05 职场文书
2016新年年会主持词
2015/07/06 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
小学语文教学随笔
2015/08/14 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL
React四级菜单的实现
2022/04/08 Javascript