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获取beautifulphoto随机某图片代码实例
Dec 18 Python
跟老齐学Python之有容乃大的list(1)
Sep 14 Python
Python中函数的多种格式和使用实例及小技巧
Apr 13 Python
Python端口扫描简单程序
Nov 10 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
python实现字符串和字典的转换
Sep 29 Python
Python连接字符串过程详解
Jan 06 Python
python字符串下标与切片及使用方法
Feb 13 Python
Numpy 多维数据数组的实现
Jun 18 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 Python
python双向链表实例详解
May 25 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
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python对html过滤处理的方法
2018/10/21 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
python实现简单井字棋游戏
2020/03/04 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
keras slice layer 层实现方式
2020/06/11 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
SQL语言面试题
2013/08/27 面试题
倡议书范文
2014/04/16 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
捐助感谢信
2015/01/22 职场文书
公务员年终个人总结
2015/02/12 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
管辖权异议上诉状
2015/05/23 职场文书
教师读书笔记
2015/06/29 职场文书
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏