python xml文件操作

第一次在簡書上寫隨筆,不足之處,請多多包涵。

本人深度學習小白,實習的第一個任務就是肺結節的檢測定位問題。而faster-rcnn模型在VOC數據集上的標簽采用的是xml文件。所以碰到的第一個問題就是xml文件的解析與編寫,把自己使用到的東西總結一下,共同進步。

一、xml文件和xml.etree.ElementTree模塊(簡稱ET)

先大致介紹一下xml文件:xml文件可以理解為一個樹結構,有根結點,子結點的概念。每個結點元素(element)包含結點名(tag)、屬性值(atrrib)和文本(text)。(以下參考自http://www.w3school.com.cn/xml/xml_tree.asp

image
<bookstore>
    <book category="COOKING">
          <title lang="en">Everyday Italian</title>
          <author>Giada De Laurentiis</author>
          <year>2005</year>
          <price>30.00</price>
    </book>
    <book category="CHILDREN">
          <title lang="en">Harry Potter</title>
          <author>J K. Rowling</author>
          <year>2005</year>
          <price>29.99</price>
    </book>
    <book category="WEB">
          <title lang="en">Learning XML</title>
          <author>Erik T. Ray</author>
          <year>2003</year>
          <price>39.95</price>
    </book>
</bookstore>

python中用于解析xml文件的模塊很多,相比于xml.dom,xml.sax,xml.parser.expat等,ET模塊提供了一個輕量級、Pythonic的API,同時還有一個高效的C語言實現,即xml.etree.cElementTree。簡而言之,更快,更便捷,而且也夠用。下面這個是官方文檔:
xml.etree.ElementTree — The ElementTree XML API — Python 3.7.2 documentation

二、ET模塊xml文件解析

讀取根結點和遍歷子結點

import xml.etree.Element as ET

#從xml文件中讀取,用getroot獲取根節點,根節點也是Element對象
tree = ET.parse('file.xml')
root = tree.getroot()

#打印根節點的標簽和屬性
for child in root:
    print(child.tag, child.attrib)

查詢結點和獲得信息


#find返回查到的第一個結點元素
first_book = root.find("book")
print(first_book.attrib)

##findall用來查找直接子元素
for book in root.findall('book'):
    author = book.find('author').text
    print(author)

#iter返回結點中所有的查找對象
for title in root.iter('title'):
    print(title.attrib['lang'])

三、ET模塊xml文件編寫

import xml.etree.ElementTree as ET

#創建根節點
a = ET.Element("bookstore")

#創建子節點,并添加屬性
b = ET.SubElement(a,"book")
b.attrib = {"category":"COOKING"}

#創建子節點,并添加數據
c = ET.SubElement(b,"title")
c.attrib = {"lang":"en"}
c.text = "Everyday Italian"

#創建結點,并添加入父節點中
book2 = ET.Element("book")
book2.attrib = {"category":"CHILDREN"}
title2 = ET.SubElement(book2,"title")
title2.attrib = {"lang":"en"}
title2.text = "Harry Potter"
a.append(book2)

#創建elementtree對象,寫文件
tree = ET.ElementTree(a)
tree.write("test.xml")
這個部分的函數不難使用,但是實際想要寫一個完整的xml文件,建議將樹結構的一部分當作樹處理,最后用append函數添加進父節點中。

四、ET模塊xml文件修改

ElementTree.write("xmlfile"):更新xml文件
Element.append():為當前element對象添加子元素(element)
Element.set(key,value):為當前element的key屬性設置value值
Element.remove(element):刪除為element的節點

#讀取待修改文件
updateTree = ET.parse("test.xml")
root = updateTree.getroot()

#創建新節點并添加為root的子結點
newEle = ET.Element("NewElement")
newEle.text = "This is a new element"
root.append(newEle)

#修改book的category屬性
book1 = root.find("book")
book1.set("category","new_cate")

#修改title的數據值
title1 = book1.find("title")
title1.text = "New Value"

#刪除子結點
for book in root.findall("book"):
    if book.find("title").text == "Harry Potter":
        root.remove("book")

#寫回原文件
updateTree.write("test.xml")

XML的操作比較常見,所需要做的操作無非就是常用的讀寫xml文件、元素節點的增刪改查,大家還可以在python官方文檔上學習更多的操作。
https://docs.python.org/3.7/library/xml.etree.elementtree.html

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容