欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python根據(jù)指定文件生成XML的方法

 更新時(shí)間:2020年06月29日 09:37:13   作者:Surpassme  
這篇文章主要介紹了Python根據(jù)指定文件生成XML的方法,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

    因項(xiàng)目需要根據(jù)指定格式的文件生成XML標(biāo)注文件,可以方便使用LabelImg打開進(jìn)行編輯和查看。其原始文件默認(rèn)使用逗號(hào)進(jìn)行分隔,如下所示:

  • 第1個(gè)值:原始圖片中切圖小文件,以AIpng_x,其中x代表原始圖片的第幾個(gè)切圖文件
  • 第2~5值:分別對(duì)應(yīng)于ymin, xmin, ymax, xmax
  • 第6個(gè)值:代表對(duì)應(yīng)的標(biāo)簽標(biāo)注

    在生成XML文件時(shí),需要對(duì)其進(jìn)行匯總,即將屬于同一個(gè)原始文件的切圖小文件的標(biāo)注匯總到一起,其實(shí)現(xiàn)代碼如下所示:

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()
          # 創(chuàng)建根節(jié)點(diǎn)
          rootNode = doc.createElement("annotation")
          # 添加根節(jié)點(diǎn)
          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:這里再為大家提供幾款關(guān)于xml操作的在線工具供大家參考使用:

在線XML/JSON互相轉(zhuǎn)換工具:
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

對(duì)關(guān)于Python生成XML相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python操作xml數(shù)據(jù)技巧總結(jié)》

以上就是Python根據(jù)指定文件生成XML的方法的詳細(xì)內(nèi)容,更多關(guān)于Python生成XML的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python錯(cuò)誤+異常+模塊總結(jié)

    Python錯(cuò)誤+異常+模塊總結(jié)

    這篇文章主要介紹了Python錯(cuò)誤+異常+模塊總結(jié),在編程時(shí)遇見錯(cuò)誤信息在所難免,Python中會(huì)也有很多種錯(cuò)誤信息,常見的兩種就是語法錯(cuò)誤和邏輯錯(cuò)誤,下文我們就來總結(jié)一下那些常見的異常,需要的小伙伴可以參考一下
    2022-05-05
  • 詳解python函數(shù)傳參是傳值還是傳引用

    詳解python函數(shù)傳參是傳值還是傳引用

    本篇文章主要介紹了詳解python函數(shù)傳參是傳值還是傳引用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • python?apscheduler?cron定時(shí)任務(wù)觸發(fā)接口自動(dòng)化巡檢過程

    python?apscheduler?cron定時(shí)任務(wù)觸發(fā)接口自動(dòng)化巡檢過程

    這篇文章主要介紹了python?apscheduler?cron定時(shí)任務(wù)觸發(fā)接口自動(dòng)化巡檢過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Pandas中把dataframe轉(zhuǎn)成array的方法

    Pandas中把dataframe轉(zhuǎn)成array的方法

    下面小編就為大家分享一篇Pandas中把dataframe轉(zhuǎn)成array的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python使用pymysql操作MySQL錯(cuò)誤代碼1054和1064處理方式

    python使用pymysql操作MySQL錯(cuò)誤代碼1054和1064處理方式

    這篇文章主要介紹了python使用pymysql操作MySQL錯(cuò)誤代碼1054和1064處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 使用 prometheus python 庫編寫自定義指標(biāo)的方法(完整代碼)

    使用 prometheus python 庫編寫自定義指標(biāo)的方法(完整代碼)

    這篇文章主要介紹了使用 prometheus python 庫編寫自定義指標(biāo)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 對(duì)python中的iter()函數(shù)與next()函數(shù)詳解

    對(duì)python中的iter()函數(shù)與next()函數(shù)詳解

    今天小編就為大家分享一篇對(duì)python中的iter()函數(shù)與next()函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python之捕捉異常詳解

    Python之捕捉異常詳解

    這篇文章主要為大家介紹了Python的捕捉異常,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • python創(chuàng)建ArcGIS shape文件的實(shí)現(xiàn)

    python創(chuàng)建ArcGIS shape文件的實(shí)現(xiàn)

    今天小編就為大家分享一篇python創(chuàng)建ArcGIS shape文件的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 舉例講解Python中is和id的用法

    舉例講解Python中is和id的用法

    這篇文章主要介紹了舉例講解Python中is和id的用法,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),作者舉例進(jìn)行了簡(jiǎn)單說明,需要的朋友可以參考下
    2015-04-04

最新評(píng)論