python中的txt文件转换为XML

作者:LGDDDDDD 时间:2021-12-05 10:45:48 

txt文件转换为XML

很多目标检测的模型都是默认需要VOC的文件输入格式

手上数据label是txt文件。

为了避免不必要的bug,还是选择转换下格式

将数据按VOC形式放置

python中的txt文件转换为XML

文件夹内容
Annotations存放生成的XML文件
JPEGImagesJPG图片
ImageSets标明训练集测试集的txt文件
Labelsstxt格式的Label文件
# -*- coding: utf-8 -*-

from xml.dom.minidom import Document
import os
import os.path
from PIL import Image
import importlib
import sys
importlib.reload(sys)

xml_path = "Annotations\\"
img_path = "JPEGImages\\"
ann_path = "Labelss\\"

if not os.path.exists(xml_path):
   os.mkdir(xml_path)

def writeXml(tmp, imgname, w, h, objbud, wxml):
   doc = Document()
   # owner
   annotation = doc.createElement('annotation')
   doc.appendChild(annotation)
   # owner
   folder = doc.createElement('folder')
   annotation.appendChild(folder)
   folder_txt = doc.createTextNode("VOC2007")
   folder.appendChild(folder_txt)

filename = doc.createElement('filename')
   annotation.appendChild(filename)
   filename_txt = doc.createTextNode(imgname)
   filename.appendChild(filename_txt)
   # ones#
   source = doc.createElement('source')
   annotation.appendChild(source)

database = doc.createElement('database')
   source.appendChild(database)
   database_txt = doc.createTextNode("The VOC2007 Database")
   database.appendChild(database_txt)

annotation_new = doc.createElement('annotation')
   source.appendChild(annotation_new)
   annotation_new_txt = doc.createTextNode("PASCAL VOC2007 ")
   annotation_new.appendChild(annotation_new_txt)

image = doc.createElement('image')
   source.appendChild(image)
   image_txt = doc.createTextNode("flickr")
   image.appendChild(image_txt)
   # onee#
   # twos#
   size = doc.createElement('size')
   annotation.appendChild(size)

width = doc.createElement('width')
   size.appendChild(width)
   width_txt = doc.createTextNode(str(w))
   width.appendChild(width_txt)

height = doc.createElement('height')
   size.appendChild(height)
   height_txt = doc.createTextNode(str(h))
   height.appendChild(height_txt)

depth = doc.createElement('depth')
   size.appendChild(depth)
   depth_txt = doc.createTextNode("3")
   depth.appendChild(depth_txt)
   # twoe#
   segmented = doc.createElement('segmented')
   annotation.appendChild(segmented)
   segmented_txt = doc.createTextNode("0")
   segmented.appendChild(segmented_txt)

# threes#
   object_new = doc.createElement("object")
   annotation.appendChild(object_new)

name = doc.createElement('name')
   object_new.appendChild(name)
   name_txt = doc.createTextNode('cancer')
   name.appendChild(name_txt)

pose = doc.createElement('pose')
   object_new.appendChild(pose)
   pose_txt = doc.createTextNode("Unspecified")
   pose.appendChild(pose_txt)

truncated = doc.createElement('truncated')
   object_new.appendChild(truncated)
   truncated_txt = doc.createTextNode("0")
   truncated.appendChild(truncated_txt)

difficult = doc.createElement('difficult')
   object_new.appendChild(difficult)
   difficult_txt = doc.createTextNode("0")
   difficult.appendChild(difficult_txt)
   # threes-1#
   bndbox = doc.createElement('bndbox')
   object_new.appendChild(bndbox)

xmin = doc.createElement('xmin')
   bndbox.appendChild(xmin)

#objbud存放[类别,xmin,ymin,xmax,ymax]
   xmin_txt = doc.createTextNode(objbud[1])
   xmin.appendChild(xmin_txt)

ymin = doc.createElement('ymin')
   bndbox.appendChild(ymin)
   ymin_txt = doc.createTextNode(objbud[2])
   ymin.appendChild(ymin_txt)

xmax = doc.createElement('xmax')
   bndbox.appendChild(xmax)
   xmax_txt = doc.createTextNode(objbud[3])
   xmax.appendChild(xmax_txt)

ymax = doc.createElement('ymax')
   bndbox.appendChild(ymax)
   ymax_txt = doc.createTextNode(objbud[4])
   ymax.appendChild(ymax_txt)
   # threee-1#
   # threee#

tempfile = tmp + "test.xml"
   with open(tempfile, "wb") as f:
       f.write(doc.toprettyxml(indent="\t", newl="\n", encoding="utf-8"))

rewrite = open(tempfile, "r")
   lines = rewrite.read().split('\n')
   newlines = lines[1:len(lines) - 1]

fw = open(wxml, "w")
   for i in range(0, len(newlines)):
       fw.write(newlines[i] + '\n')

fw.close()
   rewrite.close()
   os.remove(tempfile)
   return

for files in os.walk('E:\ssd_pytorch_cancer\data\cancer_or_not\Labels'):
   print(files)
   temp = "/temp/"
   if not os.path.exists(temp):
       os.mkdir(temp)
   for file in files[2]:
       print(file + "-->start!")
       img_name = os.path.splitext(file)[0] + '.jpg'
       fileimgpath = img_path + img_name
       im = Image.open(fileimgpath)
       width = int(im.size[0])
       height = int(im.size[1])

filelabel = open(ann_path + file, "r")
       lines = filelabel.read().split(' ')
       obj = lines[:len(lines)]

filename = xml_path + os.path.splitext(file)[0] + '.xml'
       writeXml(temp, img_name, width, height, obj, filename)
   os.rmdir(temp)

不过代码只使用于每个label文件只有一个标注框,可在生成bndbox节点处加入循环

来源:https://blog.csdn.net/weixin_43289424/article/details/106371995

标签:txt文件,XML,python
0
投稿

猜你喜欢

  • python实现定时压缩指定文件夹发送邮件

    2022-06-02 19:32:36
  • Python scrapy爬取小说代码案例详解

    2021-09-18 17:03:52
  • JavaScript随机打乱数组顺序之随机洗牌算法

    2024-05-03 15:33:00
  • scrapy自定义pipeline类实现将采集数据保存到mongodb的方法

    2021-03-20 02:55:59
  • numpy.linalg.eig() 计算矩阵特征向量方式

    2022-11-04 05:27:00
  • 用Python画小女孩放风筝的示例

    2021-11-20 09:40:25
  • 使用Python打造一款间谍程序的流程分析

    2021-11-21 08:12:32
  • 网站508规范(译)

    2008-04-03 13:26:00
  • 推荐一款高效的python数据框处理工具Sidetable

    2022-07-22 04:34:25
  • python-json校验-jsonpath解析

    2023-11-20 11:40:01
  • Anaconda环境变量的配置图文详解

    2021-09-11 04:50:26
  • Golang爬虫框架 colly的使用

    2024-02-02 13:40:55
  • Python Vaex实现快速分析100G大数据量

    2021-05-24 08:48:58
  • PHP高级编程实例:编写守护进程

    2023-10-27 02:03:22
  • 手残删除python之后的补救方法

    2021-04-13 12:50:04
  • 采用XMLHTTP编写一个天气预报的程序

    2007-10-15 12:35:00
  • 如何用Python进行时间序列分解和预测

    2022-06-20 14:39:42
  • Python设计模式之建造者模式实例详解

    2021-07-13 17:37:03
  • SQL Server数据库管理常用SQL和T-SQL语句

    2009-05-07 14:01:00
  • Mysql CONVERT函数的具体使用

    2024-01-27 03:52:12
  • asp之家 网络编程 m.aspxhome.com