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 相关文章推荐
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
python3 读取Excel表格中的数据
Oct 16 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 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
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
简单的JS多重继承示例
2008/03/13 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
int和Integer有什么区别
2013/05/25 面试题
高一物理教学反思
2014/01/24 职场文书
文明寄语大全
2014/04/11 职场文书
教室标语大全
2014/06/21 职场文书
表扬稿格式范文
2015/01/16 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang