python遍歷文件 python創建XML對象 方法 python解析XML文件 提取ROI坐標計存入文件


 

原文作者:aircraft

原文地址:https://www.cnblogs.com/DOMLX/p/8213442.html

 

 XML文件???

  xml即可擴展標記語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。

里面的標簽都是可以隨心所欲的按照他的命名規則來定義的,文件名為roi.xml

<?xml version="1.0" encoding="UTF-8"?>
<readingSession>
    <roi>
        <xCoord id="1">312</xCoord>
          <yCoord>355</yCoord>
    </roi>
</readingSession>

 

第一行是XML序言,<?xml version="1.0"?>。這一行代碼會告訴解析器和瀏覽器,這個文件應該按照1.0版本的XML規則進行解析。
encoding = "utf-8"表示此XML文件采用utf-8的編碼格式。

里面的標簽都是自己命名定義的 只要符合這種包圍的命名都可以 <></> 還有注意縮進。

解析xml文件第一步:
  
#coding=utf-8
import  xml.dom.minidom
#打開xml文檔
dom = xml.dom.minidom.parse('roi.xml')

#得到xml文檔元素對象
root = dom.documentElement
 

獲得了對象之后就可以運用一些對元素標簽操作的語法,每一個像<></>這樣的標簽 都是一個結點,而每一個結點都有它的nodeNamenodeValuenodeType屬性,寫法是root.nodeName   要注意了這些語法對大小寫都是敏感的,錯一個大小寫都是不行的,一般都符合駝峰的格式。

顧名思義  nodename 就是結點的名字 也就是標簽名,nodevalue 就是結點里面的值 或者數據  不過這個只對文本結點有效。

第二步對XML文件進行操作,獲取其中的值:

#coding=utf-8
import  xml.dom.minidom

#打開xml文檔
dom = xml.dom.minidom.parse('roi.xml')

#得到xml文檔元素對象
root = dom.documentElement

#開始操作
#獲取readSession標簽集並且繼續獲取標簽集中第一個readSession下的xCoord標簽集 roiX=root.getElementsByTagName('readingSession')[0].getElementsByTagName('roi')[0].getElementsByTagName('xCoord')
#獲取到了xCoord第一子集 的子元素的數據 將其打印 firstChild 在這里代表xCoord的文本內容 也是一個文本結點 將文本結點的數據打印 print roiX[0].firstChild.data #還可以獲取長度 xLen = root.getElementsByTagName('readingSession').length print xLen

 

 getElementsByTagName(標簽名)這個函數就是用來通過標簽名字獲取

通過getElementsByTagName(標簽名)獲取到了標簽元素對象  如果這個標簽有id屬性=“”也可以獲取這個標簽中的ID, 注意到xCoord中有一個id屬性   直接ID=roiX.getAttribute("id")  就可以獲取了    

這里還有很多對其操作的方法  就不詳細介紹了。

 

接下來看看用Python遍歷文件:

 

import os
 #這是我的 文件目錄路徑

path = 'C:\Program Files\Java\jre-9.0.1\lib\jfr'

 #將os.walk在元素中提取的值,分別放到root(根目錄),dirs(目錄名),files(文件名)中。 
for root, dirs, files in os.walk(path): print( "files = ", files) print len(files)

 

非常簡單的代碼,這里我只對files文件名進行遍歷打印  其他的用法大家看到這個語法就可以自己嘗試了。

 

 

 

接下來進入正題  遍歷文件解析XML文件 提取坐標集存入文檔:

  先看一部分簡單版本的XML文件,目標就是將其中X,Y坐標提取存入文件          用途方便后來對數字圖像處理的操作

<readingSession>
    <annotationVersion>3.12</annotationVersion>
    <servicingRadiologistID>540461523</servicingRadiologistID>
    <unblindedReadNodule>
      <noduleID>Nodule 001</noduleID>
      <characteristics>
        <subtlety>5</subtlety>
        <internalStructure>1</internalStructure>
        <calcification>6</calcification>
        <sphericity>3</sphericity>
        <margin>3</margin>
        <lobulation>3</lobulation>
        <spiculation>4</spiculation>
        <texture>5</texture>
        <malignancy>5</malignancy>
      </characteristics>
      <roi>
        <imageZposition>-125.000000 </imageZposition>
        <imageSOP_UID>1.3.6.1.4.1.14519.5.2.1.6279.6001.110383487652933113465768208719</imageSOP_UID>
        <inclusion>TRUE</inclusion>
        <edgeMap>
          <xCoord>312</xCoord>
          <yCoord>355</yCoord>
        </edgeMap>
        <edgeMap>
          <xCoord>311</xCoord>
          <yCoord>356</yCoord>
        </edgeMap>
        <edgeMap>
          <xCoord>310</xCoord>
          <yCoord>357</yCoord>
        </edgeMap>
        <edgeMap>
          <xCoord>309</xCoord>
          <yCoord>357</yCoord>
        </edgeMap>
        <edgeMap>
          <xCoord>308</xCoord>
          <yCoord>358</yCoord>
        </edgeMap>
     </roi>
<readingSession>

接下來看看PYTHON部分的代碼:

# -*- coding: UTF-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
#from __future__ import divition

import  xml.dom.minidom
import os
path = 'C:\Program Files\Java\jre-9.0.1\lib\jfr'

#遍歷文件夾獲取文件名返回數組
for root, dirs, files in os.walk(path):
    print( "files = ", files)
    print len(files)


#通過文件名數組,不斷的打開XML文件提取坐標
for f in range(len(files)):
    fpName = files[f]

#獲取XML文件的除了xml三個后綴之前的名字

    nn =str(fpName[0:3])

  #對每個XML文件都以相同的名字打開   W的方式  沒有文件的話  會自動創建一個出來

    fp = open(nn+".txt","w")
    print nn
    print fpName

    #打開XML文檔
    dom = xml.dom.minidom.parse(fpName)
         #得到文檔元素對象
    root = dom.documentElement

    #獲取標簽集並提取坐標存入文檔
    drLen= root.getElementsByTagName('readingSession').length
    if(drLen != 0):
        for s in range(drLen):
                drText ="\n\nDR"+str(s+1)+"\n\n"
                fp.write(drText)
                bb = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi').length
                for i in range(bb):
                    roiX = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('xCoord')
                    xLen = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('xCoord').length
                    roiY = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('yCoord')
                    yLen = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('yCoord').length
                    
                    xText = "\n    第"+str(i+1)+"個roi的X坐標\n"
                    fp.write(xText)
                    
                    #將X坐標全部存入
                    roiData =""
                    for j in range(xLen):
                        roiData+= str(roiX[j].firstChild.data)+","
                        fp.write(roiData)
                        
                    yText ="\n    Y坐標\n"
                    fp.write(yText)
                    for k in range(yLen)   :
                        roiData += str(roiX[j].firstChild.data)+","
                        fp.write(roiData)
                                  
        fp.close()

 

  以上代碼完成后就能形成一個這樣的文件:

 

 

 

  如果是遍歷解析的話  大概就會形成這樣的一堆文件:

 

 

 



大家好我是飛機,是一個想成為全棧工程師的男人。


 

若有興趣交流分享技術,可關注本人公眾號,里面會不定期的分享各種編程教程,和共享源碼,諸如研究分享關於c/c++,python,前端,后端,opencv,halcon,opengl,機器學習深度學習之類有關於基礎編程,圖像處理和機器視覺開發的知識


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM