网络编程
位置:首页>> 网络编程>> Python编程>> Python根据指定文件生成XML的方法

Python根据指定文件生成XML的方法

作者:Surpassme  发布时间:2022-09-06 21:00:10 

标签:Python,生成,XML

    因项目需要根据指定格式的文件生成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.jb51.net/code/xmljson

在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat

XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress

XML代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat

对关于Python生成XML相关内容感兴趣的读者可查看本站专题:《Python操作xml数据技巧总结》

来源:https://www.cnblogs.com/surpassme/p/13204899.html

0
投稿

猜你喜欢

  • 有如下 borg pattern 的实现:class Borg(object):  __shared_state = {}def
  • 紧接上回,已经完成了单独的贪食蛇的控制,但是呢,居然没有苹果可以吃,所以,非常简单的加入苹果,同时呢,修改一下主程序中贪食蛇的创建,单独编写
  • gob是Golang包自带的一个数据结构序列化的编码/解码工具。编码使用Encoder,解码使用Decoder。一种典型的应用场景就是RPC
  • 呵呵,这几天沉溺于灌水,发现转贴的时候真的是很不方便,文字、图形、颜色、连接,如果都转过来真的是满费劲的,于是就写了一个小东西,简陋的很,不
  • 方法一、input标签上传如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操
  • python之参数,定义时小括号中的参数,用来接收参数用的,称为 “形参”调用时小括号中的参数,用来传递给函数用的,称为 “实参”。1、思考
  • 本文实例讲述了GO语言标准错误处理机制error用法。分享给大家供大家参考。具体分析如下:在 Golang 中,错误处理机制一般是函数返回时
  • 今天来聊一下 Go 如何使用 set,本文将会涉及 set 和 bitset 两种数据结构。Go 的数据结构Go 内置的数据结构并不多。工作
  • 由于同事电脑上没有直接可以压缩gz.tar格式的压缩软件,而工作中这个又时常需要将zip文件转换为gz.tar格式,所以常常将压缩为zip格
  • 一、安装MySQL在Ubuntu中,默认情况下,只有最新版本的MySQL包含在APT软件包存储库中,要安装它,只需更新服务器上的包索引并安装
  • 本文介绍了Python格式化输出%s和%d的实例案例。分享给大家供大家参考,具体如下:python print格式化输出1. 打印字符串pr
  • 本文实例讲述了Python实现判断并移除列表指定位置元素的方法。分享给大家供大家参考,具体如下:问题很简单,输入一个列表和索引,若索引超出列
  • 前言接口在面向对象编程中是经常使用的招式,也是体现多态很重要的手段。是的。Golang中也有接口这玩意儿。1.为什么需要接口?多数情况下,数
  • Javascript 实现计算器:系列文章:JS 实现计算器详解及实例代码(一)Javascript 实现计算器时间功能详解及实例(二)小型
  • 今天有朋友问到如下一则案例,ORA-01114,ORA-27067以及OSD-04026错误同时出现:*** ACTION NAME:()
  • 前言1、防抖(debounce):触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间举例:就好像在百
  • 在国内,大部分人都是过农历生日,然后借助日历工具获取农历日期对应的阳历日期,以这一天来过生!这里还有一个痛点,即:每一年的农历生日对应的阳历
  • 一、identity的基本用法1.含义identity表示该字段的值会自动更新,不需要我们维护,通常情况下我们不可以直接给identity修
  • 0x01春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程。第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取
  • 1,登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如
手机版 网络编程 asp之家 www.aspxhome.com