第一次在簡書上寫隨筆,不足之處,請多多包涵。
本人深度學習小白,實習的第一個任務就是肺結節的檢測定位問題。而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)
<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