Python應用基礎-根據指定文件生成XML

来源:https://www.cnblogs.com/surpassme/archive/2020/06/28/13204899.html
-Advertisement-
Play Games

因項目需要根據指定格式的文件生成XML標註文件,可以方便使用LabelImg打開進行編輯和查看。其原始文件預設使用逗號進行分隔,如下所示: 第1個值:原始圖片中切圖小文件,以AIpng_x,其中x代表原始圖片的第幾個切圖文件 第2~5值:分別對應於ymin, xmin, ymax, xmax 第6個 ...


    因項目需要根據指定格式的文件生成XML標註文件,可以方便使用LabelImg打開進行編輯和查看。其原始文件預設使用逗號進行分隔,如下所示:
image.png

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

image.png

    在LabelImg中的效果如下所示:
image.png

本文地址:https://www.cnblogs.com/surpassme/p/13204899.html

本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、sentinel是什麼 sentinel的官方名稱叫分散式系統的流量防衛兵。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。在Spring Cloud項目中最開始我們使用的是Hystrix,目前已停止更新了。現在Spring Cloud官方推薦的是 ...
  • 老孟導讀:【Flutter實戰】系列文章地址:http://laomengit.com/guide/introduction/mobile_system.html 預設情況下,Flutter 的滾動組件(比如 ListView)沒有顯示滾動條,使用 Scrollbar 顯示滾動條: Scrollba ...
  • 作者:鄭鄭好victorzheng juejin.im/post/5baa54e1f265da0ac2566fb2 文章綱要 此次分享的緣由 目前分散式事務問題是怎麼解決的 行業中有什麼解決方案 這些解決方案分別有什麼優缺點 別人是怎麼做的 我們可以怎麼來做 此次分享的緣由 支付重構 考慮支付重構的 ...
  • 12 自定義功能 In many cases, it is desirable to change the default wrapping of particular declarations in an interface. For example, you might want to prov ...
  • 線程認識與創建方式 1,並行與併發 並行:同一時刻同時執行方法 併發:一個時間段執行的方法 2,線程認識 啟動一個進程時,至少會同時啟動一個線程,是一個進程分不同模塊同時執行不同的工作, 一般情況下啟動Java程式,main方法是一個主線程啟動的同時會啟動垃圾回收的線程 3,開啟線程的方法 四種:繼 ...
  • 基於GO語言實現的web客服即時通訊與客服管理系統。 1.使用gin http框架實現restful風格的API 2.使用jwt-go配合gin中間件實現無狀態的jwt登陸認證 3.使用casbin配合gin中間件實現許可權控制 4.使用gin以及template包的模板語法進行展示界面 5.使用go ...
  • 本文源碼:GitHub·點這裡 || GitEE·點這裡 一、流量控制 1、基本概念 流量控制的核心作用是限制流出某一網路的某一連接的流量與突發,使這類報文以比較均勻的速度流動發送,達到保護系統相對穩定的目的。通常是將請求放入緩衝區或隊列內,然後基於特定策略處理請求,勻速或者批量處理,該過程也稱流量 ...
  • 之前的博文介紹了tomcat有兩大核心組件,connector和container,connector負責接受外部請求,container負責處理請求,本文從源碼的角度介紹container的整體架構。 一、容器分類 tomcat容器為四個: Engine:代表容器引擎,管理多個虛擬站點,一個Ser ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...