zoukankan      html  css  js  c++  java
  • 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 FilesJavajre-9.0.1libjfr'

     #将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 FilesJavajre-9.0.1libjfr'
    
    #遍历文件夹获取文件名返回数组
    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 ="
    
    DR"+str(s+1)+"
    
    "
                    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 = "
        第"+str(i+1)+"个roi的X坐标
    "
                        fp.write(xText)
                        
                        #将X坐标全部存入
                        roiData =""
                        for j in range(xLen):
                            roiData+= str(roiX[j].firstChild.data)+","
                            fp.write(roiData)
                            
                        yText ="
        Y坐标
    "
                        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,机器学习深度学习之类有关于基础编程,图像处理和机器视觉开发的知识

    转发和使用本文,请注明作者信息和原文地址---本文原作者为aircraft ---大家好我是徐飞机,有没有大佬们的公司招c++开发/图像处理/opengl/opencv/halcon实习的啊,带上我一个呗QAQ。。。hhhhhh 想要免费获取前端,后端,c/c++,matlab,Python,opencv,机器学习,深度学习,安卓,java,等等全套视频教程请关注机器视觉开发公众号,转发集赞28即可百度云获得hhhhhhhh
  • 相关阅读:
    vue报错:Not Found
    使用Vue DevTools 插件报错的问题:Vue.js is detected on this page. Open DevTools and look for the Vue panel.
    Linux安装docker
    asp.net5.0源码(Microsoft github源码)
    探索Asp net core3中的 项目文件、Program.cs和通用host(转)
    c#中的sealed关键字
    .NET平台常见技术框架整理汇总
    疫情下孩子的网课
    常系数齐次线性递推
    【2021~2022】模拟赛乱写 Period I
  • 原文地址:https://www.cnblogs.com/DOMLX/p/8213442.html
Copyright © 2011-2022 走看看