专栏首页大学生计算机视觉学习DeepLearningpython遍历文件 python创建XML对象 方法 python解析XML文件 提取ROI坐标计存入文件

python遍历文件 python创建XML对象 方法 python解析XML文件 提取ROI坐标计存入文件

  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文档

获得了对象之后就可以运用一些对元素标签操作的语法,每一个像<></>这样的标签 都是一个结点,而每一个结点都有它的nodeName,nodeValue,nodeType属性,写法是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

非常简单的代码,这里我只对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()

  以上代码完成后就能形成一个这样的文件:

  如果是遍历解析的话  大概就会形成这样的一堆文件:

大家好我是飞机,是一个想成为全栈工程师的男人。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python遍历文件 python创建XML对象 方法 python解析XML文件 提取ROI坐标计存入文件

    徐飞机
  • c++ 网络编程(八)TCP/IP LINUX-epoll/windows-IOCP下 socket opoll函数用法 优于select方法的epoll 以及windows下IOCP 解决多

    原文链接:https://www.cnblogs.com/DOMLX/p/9622548.html

    徐飞机
  • c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)

    原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html

    徐飞机
  • python遍历文件 python创建XML对象 方法 python解析XML文件 提取ROI坐标计存入文件

    徐飞机
  • 文科生带你学Python|正式开始coding之前

    上一篇我们讲了如何如何开始编写第一行Python程序,看起来是不是还挺简单的?确实,Python上手非常非常容易,但是世上哪有那么便宜的事情,入门容易的事情往往...

    二号姬
  • VS Code+Anaconda打造舒适的Python环境

    專 欄 ❈ 作者:麦艳涛,挖掘机小王子,数据分析爱好者。 原文链接:https://zhuanlan.zhihu.com/p/28617629 ❈ 最近一直...

    Python中文社区
  • 整顿现金贷,金融环境会好吗?

    数据猿导读 清理整顿现金贷,金融环境真的会变好吗?笔者认为,现金贷只是消费金融高速发展的产物,大众的需求决定了它的发展。一味的清理禁止,不能从根本上决绝问题,也...

    数据猿
  • 自噬相关基因模型在非小细胞肺癌中的预后意义

    各位小伙伴们大家好,这次给大家分享的文献是Prognostic implications of autophagy-associated gene signat...

    百味科研芝士
  • 数值积分|泰勒(Taylor)公式求积分

    泰勒(Taylor)公式大致可以叙述为:函数在一个点的邻域内的值可以用函数在该点的值及各阶导数值组成的无穷级数表示出来。ƒ(x)在x=a处的泰勒展开式为:

    fem178
  • MATLAB 中有哪些命令,让人相见恨晚?

    提问都说了是命令,大家回答那么多函数干什么... 我来给一个超级大杀器 在命令行敲入 dbstop if error

    bear_fish

扫码关注云+社区

领取腾讯云代金券