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 22 Python
python指定写入文件时的编码格式方法
Jun 07 Python
python如何创建TCP服务端和客户端
Aug 26 Python
Python设计模式之策略模式实例详解
Jan 21 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 Python
Pytorch之contiguous的用法
Dec 31 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
python统计函数库scipy.stats的用法解析
Feb 25 Python
Pytorch环境搭建与基本语法
Jun 03 Python
pandas中关于apply+lambda的应用
Feb 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
本地计算机无法启动Apache故障处理
2014/08/08 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
ThinkPHP分页实例
2014/10/15 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
python图片验证码生成代码
2016/07/02 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python中的引用知识点总结
2019/05/20 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
python求最大值最小值方法总结
2019/06/25 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
解析MySQL索引的作用
2022/03/03 MySQL