日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 处理xml文件

發布時間:2024/3/26 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 处理xml文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

XML可擴展標記語言(eXtensible Markup Language),被設計用來傳輸和存儲數據。

<?xml version="1.0" encoding="UTF-8"?> <note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body> </note>

xml文檔形成了一種樹解構,它從根部開始,然后擴展到枝葉。在上面的文檔中,第一行是xml的聲明,定義了xml的版本和使用的編碼方式。第二行描述文檔的根元素(類似于本文檔是一個note),接下來有4個子元素,(to,from,heading,body)。
例如下面的xml文檔表示bookstore

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

語法結構

xml的聲明中,省略關閉標簽是非法的。所有元素都必須有關閉標簽,類似于


xml標簽對大小寫敏感,xml必須正確嵌套,xml的屬性值必須加上引號。例如 <note date="12/11/2007"> <to>Tove</to> <from>Jani</from> </note>

xml中的字符擁有特殊的意義,xml中存在5個實體引用

  • &lt <
  • &gt >
  • &amp &
  • &apos ’
  • &quot "

xml的注釋語法如下,和html語法一樣。

<!-- This is a comment -->

xml中空格會被保留,xml以LF存儲換行。

python對xml文件解析

常見的xml編程接口有DOM和SAX,這兩種接口處理xml文件方式不同。python中有三種方法解析xml,sax,dom一級ElementTree

1.SAX (simple API for XML )

Python 標準庫包含 SAX 解析器,SAX 用事件驅動模型,通過在解析XML的過程中觸發一個個的事件并調用用戶定義的回調函數來處理XML文件。

2.DOM(Document Object Model)

將 XML 數據在內存中解析成一個樹,通過對樹的操作來操作XML。

3.ElementTree(元素樹)

ElementTree就像一個輕量級的DOM,具有方便友好的API。代碼可用性好,速度快,消耗內存少。

注:因DOM需要將XML數據映射到內存中的樹,一是比較慢,二是比較耗內存,而SAX流式讀取XML文件,比較快,占用內存少,但需要用戶實現回調函數(handler)。

解析實例:

<collection shelf="New Arrivals"> <movie title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description> </movie> <movie title="Transformers"><type>Anime, Science Fiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>A schientific fiction</description> </movie><movie title="Trigun"><type>Anime, Action</type><format>DVD</format><episodes>4</episodes><rating>PG</rating><stars>10</stars><description>Vash the Stampede!</description> </movie> <movie title="Ishtar"><type>Comedy</type><format>VHS</format><rating>PG</rating><stars>2</stars><description>Viewable boredom</description> </movie> </collection>

xml處理子模塊包括:

  • xml.etree.ElementTree: ElementTree API,一個簡單而輕量級的XML處理器

  • xml.dom:DOM API 定義

  • xml.dom.minidom:最小的 DOM 實現

  • xml.dom.pulldom:支持構建部分 DOM 樹

  • xml.sax:SAX2 基類和便利函數

  • xml.parsers.expat:Expat解析器綁定

ET模塊解析xml文件

其中xml.etree.ElementTree模塊實現了簡單高效的API,可以用來解析和創建XML數據。
Element對象有下面的常用屬性:

  • Element.tag 標簽
  • Element.text,去除標簽,獲取標簽中的內容。
    例如
  • Element.attrib,獲取標簽中的屬性和屬性值
  • Element.findall(),找到帶有標簽的所有節點
  • Element.append(),增加新的節點
  • Element.set(),增加或者修改屬性
  • Element.remove(),刪除節點。
  • ElementTree.write()保存xml文件。

參考官方python的結構化標準處理工具XML
對于下面的示例xml文檔:

<?xml version="1.0"?> <data><country name="Liechtenstein"><rank>1</rank><year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country><country name="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighbor name="Malaysia" direction="N"/></country><country name="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighbor name="Costa Rica" direction="W"/><neighbor name="Colombia" direction="E"/></country> </data> >>> for country in root.findall('country'): ... rank = country.find('rank').text ... name = country.get('name') ... print(name, rank) ... Liechtenstein 1 Singapore 4 Panama 68

例如下面voc標注的數據,格式為xml文件:

<annotation verified="yes"><folder>Annotation</folder><filename>invoice_direction_0_0.jpg</filename><path>invoice_stamp-PascalVOC-export/Annotations/invoice_direction_0_0.jpg</path><source><database>Unknown</database></source><size><width>2962</width><height>1753</height><depth>3</depth></size><segmented>0</segmented><object><name>stamp</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>1872.3010033444816</xmin><ymin>1216.3294491525423</ymin><xmax>2370.9208472686732</xmax><ymax>1579.474458568738</ymax></bndbox> </object><object><name>stamp</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>1152.4392419175028</xmin><ymin>123.59310263653484</ymin><xmax>1505.7658862876256</xmax><ymax>351.3840630885122</ymax></bndbox> </object> </annotation> import xml.etree.ElementTree as ET import os from PIL import Image, ImageDraw, ImageFontdef parse_rec(filename):tree = ET.parse(filename) # 解析讀取xml函數objects = []img_dir =[]# Element.findall()查找當前元素的直接子元素中帶有指定標簽的元素# Element.find()找帶有特定標簽的第一個子級# Elemtn.text 訪問元素的文本內容# Element.get 訪問元素的屬性。for xml_name in tree.findall('filename'):img_path = os.path.join(pic_path, xml_name.text)img_dir.append(img_path)for obj in tree.findall('object'):obj_struct = {}obj_struct['name'] = obj.find('name').textobj_struct['pose'] = obj.find('pose').textobj_struct['truncated'] = int(obj.find('truncated').text)obj_struct['difficult'] = int(obj.find('difficult').text)bbox = obj.find('bndbox')obj_struct['bbox'] = [int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)]objects.append(obj_struct)return objects,img_dir# 可視化目標框,并顯示標簽 def visualise_gt(objects,img_dir): for id,img_path in enumerate(img_dir):img = Image.open(img_path)draw = ImageDraw.Draw(img)for a in objects:xmin =int(a['bbox'][0])ymin =int(a['bbox'][1])xmax =int(a['bbox'][2])ymax =int(a['bbox'][3])label = a['name']draw.rectangle((xmin,ymin,xmax,ymax), fill=None, outline=(0,255,0),width=2)draw.text((xmin-10,ymin-15), label, fill = (0,255,0),font=font) # 利用ImageDraw的內置函數,在圖片上寫入文字img.show()fontPath = "C:\Windows\Fonts\Consolas\consola.ttf" # 字體路徑 root = 'F:/dataset/AQM' ann_path = os.path.join(root, 'Annotations') # xml文件所在路徑 pic_path = os.path.join(root, 'JPEGImages') # 樣本圖片路徑 font = ImageFont.truetype(fontPath, 16)for filename in os.listdir(ann_path):xml_path = os.path.join(ann_path,filename)object,img_dir = parse_rec(xml_path)visualise_gt(object,img_dir )

參考:CSDN博客 - - python xml 格式的數據集標注文件解析

總結

以上是生活随笔為你收集整理的python 处理xml文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。