因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看。其原始文件默认使用逗号进行分隔,如下所示:

第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效果如下所示:

在LabelImg中的效果如下所示:

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

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

以上就是Python根据指定文件生成XML的方法的详细内容,更多关于Python生成XML的资料请关注脚本之家其它相关文章!

python生成xml文件工具_Python根据指定文件生成XML的方法相关推荐

  1. python找到文件夹下指定文件类型_python 读取指定文件夹中的指定文件类型的文件名...

    C# 读取指定文件夹中的全部文件,并按规则生成SQL语句! 本实例的目的在于: 1 了解怎样遍历指定文件夹中的全部文件 2 控制台怎样输入和输出数据 代码: using System; using S ...

  2. python保存文件到指定文件夹_python实现指定文件夹下的指定文件移动到指定位置...

    本文主要是写了一个将指定文件夹下的指定文件类型移动到指定位置,具体内容如下 # coding:utf-8 import os import shutil import sys reload(sys) ...

  3. python中多对多替换_Python对指定文件内容进行全局替换

    关于对指定文件内容进行全局替换的Python实现具体解释都附在代码里了 代码如下: import os import sys cs = sys.argv old_cs = cs[1] # 将要替换掉的 ...

  4. python删除文件夹下文件夹_python删除指定文件夹下文件和文件夹的方法详解

    前记 python删除指定文件夹下的文件,是一个常用的功能.我找了不少地方,一直没有找到合适的模版,那只好自己倒腾一个比较实用的模版了. 基本模块 这里面会用到几个模块,一个是目录下所有文件的的函数: ...

  5. python指定文件路径_python实现指定文件夹下的指定文件移动到指定位置

    # coding:utf-8 import os import shutil import sys reload(sys) sys.setdefaultencoding('utf8') # print ...

  6. python查找文件夹中的指定文件_python 递归搜索文件夹下的指定文件

    python 递归搜索文件夹下的指定文件 import os def look_in_directory(directory): """Loop through the ...

  7. python目录及文件操作_python路径及文件操作,10.22,10.27

    csv 和ini文件处理 作者: 一个小菜鸡 csv常见格式 nums     options      arguments 逗号分割值 comma-Separated Values CSV是一个被行 ...

  8. mysql xp cmdshell_LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句...

    LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件 ...

  9. python从文件夹中提取指定文件_使用Python实现从各个子文件夹中复制指定文件的方法...

    之前用来整理图片的小程序,拿来备忘,算是使用Python复制文件的一个例子. # -*- coding: utf-8 -*- #程序用来拷贝文件并输出图片采集日期等其他信息到Excel中 #文件夹结构 ...

最新文章

  1. SpringMVC-applicationContent.xml和Spring-servlet.xml的配置设置
  2. 解决Ubuntu的错误提示
  3. 【转】MongoDB C# / .NET Driver 中IMongoQuery的内部实现Query的用法
  4. 本地数据jqGrid分页
  5. httpstat:一个检查网站性能的 curl 统计分析工具
  6. 图像基础知识 —— Opencv图像处理
  7. Java中的方法(形参及实参)return返回类型
  8. 虚拟主机中,不修改IIS设置,在IIS6下运行MVC架构的网站
  9. 摘录 vue.js代码片段的理解
  10. 硬件WAF的制作!linux系统制作硬件WAF,实现透明代理,具备断电、故障Bypass功能。...
  11. TO B的百度云新品问世/价格腰斩 智能化DNA能撑起百度野心?
  12. 虚拟机-安装与使用(详细教程)
  13. 放大器输入级的差动放大 + 电流镜
  14. 我国有较大的AI大模型应用市场,在应用领域具有优势
  15. Robocup新手指南
  16. 每一个被别人吃得死死的人,其实是…
  17. jqgrid setCell 单元格赋值空字符串 无效处理
  18. 基于JAVA干洗店订单管理系统设计与实现计算机毕业设计源码+数据库+lw文档+系统+部署
  19. git将分支合并到主分支
  20. AD17如何将图片转化为PCB图片丝印,定制你的专属logo!

热门文章

  1. linux下解除端口占用
  2. 接口传参为formData类型,实现文件/图片上传功能
  3. Linux Diff命令用法
  4. sts(eclipse)安装svn插件
  5. linux fedora自定义终端terminal的快捷键
  6. linux下配置myBase7.ini
  7. 解决phoenix中创建的表名及字段默认是大写的问题
  8. k8s service:ClusterIP、NodePort、LoadBalancer、ExternalName
  9. JVM调优:图解对象内存分配过程
  10. 如果你要实现IOC,请简单描述一下实现步骤?