python利用lxml讀寫xml格式的文件
之前在轉(zhuǎn)換數(shù)據(jù)集格式的時候需要將json轉(zhuǎn)換到xml文件,用lxml包進行操作非常方便。
1. 寫xml文件
a) 用etree和objectify
from lxml import etree, objectify
E = objectify.ElementMaker(annotate=False)
anno_tree = E.annotation(
E.folder('VOC2014_instance'),
E.filename("test.jpg"),
E.source(
E.database('COCO'),
E.annotation('COCO'),
E.image('COCO'),
E.url("http://test.jpg")
),
E.size(
E.width(800),
E.height(600),
E.depth(3)
),
E.segmented(0),
)
etree.ElementTree(anno_tree).write("text.xml", pretty_print=True)
輸出的test.xml文件內(nèi)容如下:
```
如果需要在anno_tree的基礎(chǔ)上加其他標簽的話用append即可:
E2 = objectify.ElementMaker(annotate=False)
anno_tree2 = E2.object(
E.name("person"),
E.bndbox(
E.xmin(100),
E.ymin(200),
E.xmax(300),
E.ymax(400)
),
E.difficult(0)
)
anno_tree.append(anno_tree2)
上面的輸出就變成了:
<annotation> <folder>VOC2014_instance/person</folder> <filename>test.jpg</filename> <source> <database>COCO</database> <annotation>COCO</annotation> <image>COCO</image> <url>http://test.jpg</url> </source> <size> <width>800</width> <height>600</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>person</name> <bndbox> <xmin>100</xmin> <ymin>200</ymin> <xmax>300</xmax> <ymax>400</ymax> </bndbox> <difficult>0</difficult> </object> </annotation>
b) 用etree和SubElement
annotation = etree.Element("annotation")
etree.SubElement(annotation, "folder").text = "VOC2014_instance"
etree.SubElement(annotation, "filename").text = "test.jpg"
source = etree.SubElement(annotation, "source")
etree.SubElement(source, "database").text = "COCO"
etree.SubElement(source, "annotation").text = "COCO"
etree.SubElement(source, "image").text = "COCO"
etree.SubElement(source, "url").text = "http://test.jpg"
size = etree.SubElement(annotation, "size")
etree.SubElement(size, "width").text ='800' # 必須用string
etree.SubElement(size, "height").text = '600'
etree.SubElement(size, "depth").text = '3'
etree.SubElement(annotation, "segmented").text = '0'
key_object = etree.SubElement(annotation, "object")
etree.SubElement(key_object, "name").text = “person”
bndbox = etree.SubElement(key_object, "bndbox")
etree.SubElement(bndbox, "xmin").text = str(100)
etree.SubElement(bndbox, "ymin").text = str(200)
etree.SubElement(bndbox, "xmax").text = str(300)
etree.SubElement(bndbox, "ymax").text = str(400)
etree.SubElement(key_object, "difficult").text = '0'
doc = etree.ElementTree(annotation)
doc.write(open("test.xml", "w"), pretty_print=True)
2. 讀xml
這里可以用xpath直接提取所需的元素的值。比如想要獲取上面test.xml文件的x, y坐標:
tree = etree.parse("test.xml")
# get bbox
for bbox in tree.xpath('//bndbox'): # 獲取bndbox元素的內(nèi)容
for corner in bbox.getchildren(): # 便利bndbox元素下的子元素
print corner.text # string類型
參考
https://stackoverflow.com/questions/12657043/parse-xml-with-lxml-extract-element-value
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python如何實現(xiàn)Markdown記賬記錄轉(zhuǎn)Excel存儲
這篇文章主要為大家詳細介紹了Python如何實現(xiàn)Markdown記賬記錄轉(zhuǎn)Excel存儲功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-03-03
Python基于Webhook實現(xiàn)github自動化部署
這篇文章主要介紹了Python基于Webhook實現(xiàn)github自動化部署,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11
Python使用Marshmallow輕松實現(xiàn)序列化和反序列化
這篇文章主要為大家詳細介紹了Python如何使用Marshmallow輕松實現(xiàn)序列化和反序列化,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2025-03-03
python包相關(guān)知識點之包的導入、相對路徑以及絕對路徑
Python的好處在于你不需要懂很多概念,你就有機會投入工作,同樣問題也有機會隨時發(fā)生,下面這篇文章主要給大家介紹了關(guān)于python包相關(guān)知識點之包的導入、相對路徑以及絕對路徑的相關(guān)資料,需要的朋友可以參考下2022-04-04

