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的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
Python实现动态图解析、合成与倒放
Jan 18 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
python的内存管理和垃圾回收机制详解
May 18 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
浅析python内置模块collections
Nov 15 Python
Pycharm小白级简单使用教程
Jan 08 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
python中_del_还原数据的方法
Dec 09 Python
Python使用tkinter实现小时钟效果
Feb 22 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
理解Python中的With语句
2015/02/02 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
大学生创业计划书的用途
2014/01/08 职场文书
电子信息工程专业推荐信
2014/02/14 职场文书
学校食堂管理制度
2015/08/04 职场文书
区域销售大会开幕词
2016/03/04 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Python数据结构之队列详解
2022/03/21 Python