讀取xml文件python
⑴ python怎麼讀取xml
引入XML組件:import xml.dom.minidom。
創建一個xml文件,<?xml version="1.0" encoding="utf-8"?>。
相關推薦:《Python教程》
載入讀取XML文件,xml.dom.minidom.parse('abc.xml'),這是xml文件的對象。
獲取XML文檔對象,root = dom.documentElement。
獲取標簽之間的數據 ,rootdata.getElementsByTagName('caption')。
總結一下xml對象,node.getAttribute(AttributeName),獲取XML節點屬性值,node.getElementsByTagName(TagName),獲取XML節點對象集合,等等具體的查看手冊。
⑵ python3讀取XML文件時一直是找不到文件
你用的絕對路徑嗎?看看路徑是\嗎,都改成/試試還有這個文件是有擴展名的,要加.xml。
⑶ python怎麼解析xml文件
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)。
⑷ 如何用python讀取xml文件
一、簡介
XML(eXtensible Markup Language)指可擴展標記語言,被設計用來傳輸和存儲數據,已經日趨成為當前許多新生技術的核心,在不同的領域都有著不同的應用。它是web發展到一定階段的必然產物,既具有SGML的核心特徵,又有著HTML的簡單特性,還具有明確和結構良好等許多新的特性。
python解析XML常見的有三種方法:一是xml.dom.*模塊,它是W3C DOM API的實現,若需要處理DOM API則該模塊很適合,注意xml.dom包裡面有許多模塊,須區分它們間的不同;二是xml.sax.*模塊,它是SAX API的實現,這個模塊犧牲了便捷性來換取速度和內存佔用,SAX是一個基於事件的API,這就意味著它可以「在空中」處理龐大數量的的文檔,不用完全載入進內存;三是xml.etree.ElementTree模塊(簡稱 ET),它提供了輕量級的Python式的API,相對於DOM來說ET 快了很多,而且有很多令人愉悅的API可以使用,相對於SAX來說ET的ET.iterparse也提供了 「在空中」 的處理方式,沒有必要載入整個文檔到內存,ET的性能的平均值和SAX差不多,但是API的效率更高一點而且使用起來很方便。
二、詳解
解析的xml文件(country.xml):
在CODE上查看代碼片派生到我的代碼片
<?xml version="1.0"?>
<data>
<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>
1、xml.etree.ElementTree
ElementTree生來就是為了處理XML,它在Python標准庫中有兩種實現:一種是純Python實現的,如xml.etree.ElementTree,另一種是速度快一點的xml.etree.cElementTree。注意:盡量使用C語言實現的那種,因為它速度更快,而且消耗的內存更少。
在CODE上查看代碼片派生到我的代碼片
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
這是一個讓Python不同的庫使用相同API的一個比較常用的辦法,而從Python 3.3開始ElementTree模塊會自動尋找可用的C庫來加快速度,所以只需要import xml.etree.ElementTree就可以了。
在CODE上查看代碼片派生到我的代碼片
#!/usr/bin/evn python
#coding:utf-8
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
import sys
try:
tree = ET.parse("country.xml") #打開xml文檔
#root = ET.fromstring(country_string) #從字元串傳遞xml
root = tree.getroot() #獲得root節點
except Exception, e:
print "Error:cannot parse file:country.xml."
sys.exit(1)
print root.tag, "---", root.attrib
for child in root:
print child.tag, "---", child.attrib
print "*"*10
print root[0][1].text #通過下標訪問
print root[0].tag, root[0].text
print "*"*10
for country in root.findall('country'): #找到root節點下的所有country節點
rank = country.find('rank').text #子節點下節點rank的值
name = country.get('name') #子節點下屬性name的值
print name, rank
#修改xml文件
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
運行結果:
三、總結
(1)Python中XML解析可用的類庫或模塊有xml、libxml2 、lxml 、xpath等,需要深入了解的還需參考相應的文檔。
(2)每一種解析方式都有自己的優點和缺點,選擇前可以綜合各個方面的性能考慮。
(3)若有不足,請留言,在此先感謝!
⑸ 用python怎麼操作xml文件內容
一、什麼是xml?
xml即可擴展標記語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。
abc.xml
復制代碼代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<maxid>4</maxid>
<login username="pytest" passwd='123456'>
<caption>Python</caption>
<item id="4">
<caption>測試</caption>
</item>
</login>
<item id="2">
<caption>Zope</caption>
</item>
</catalog>
Ok ,從結構上,它很像我們常見的HTML超文本標記語言。但他們被設計的目的是不同的,超文本標記語言被設計用來顯示數據,其焦點是數據的外觀。它被設計用來傳輸和存儲數據,其焦點是數據的內容。
那麼它有如下特徵:
首先,它是有標簽對組成,<aa></aa>
標簽可以有屬性:<aa id='123'></aa>
標簽對可以嵌入數據:<aa>abc</aa>
標簽可以嵌入子標簽(具有層級關系):
二、獲得標簽屬性
那麼,下面來介紹如何用python來讀取這種類型的文件。
復制代碼代碼如下:
#coding=utf-8
import xml.dom.minidom
#打開xml文檔
dom = xml.dom.minidom.parse('abc.xml')
#得到文檔元素對象
root = dom.documentElement
print root.nodeName
print root.nodeValue
print root.nodeType
print root.ELEMENT_NODE
mxl.dom.minidom 模塊被用來處理xml文件,所以要先引入。
xml.dom.minidom.parse() 用於打開一個xml文件,並將這個文件對象dom變數。
documentElement 用於得到dom對象的文檔元素,並把獲得的對象給root
每一個結點都有它的nodeName,nodeValue,nodeType屬性。
nodeName為結點名字。
nodeValue是結點的值,只對文本結點有效。
nodeType是結點的類型。catalog是ELEMENT_NODE類型
現在有以下幾種:
'ATTRIBUTE_NODE'
'CDATA_SECTION_NODE'
'COMMENT_NODE'
'DOCUMENT_FRAGMENT_NODE'
'DOCUMENT_NODE'
'DOCUMENT_TYPE_NODE'
'ELEMENT_NODE'
'ENTITY_NODE'
'ENTITY_REFERENCE_NODE'
'NOTATION_NODE'
'PROCESSING_INSTRUCTION_NODE'
'TEXT_NODE'
三、獲得子標簽
現在要獲得catalog的子標簽以的標簽name
復制代碼代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<maxid>4</maxid>
<login username="pytest" passwd='123456'>
<caption>Python</caption>
<item id="4">
<caption>測試</caption>
</item>
</login>
<item id="2">
<caption>Zope</caption>
</item>
</catalog>
對於知道元素名字的子元素,可以使用getElementsByTagName方法獲取:
復制代碼代碼如下:
#coding=utf-8
import xml.dom.minidom
#打開xml文檔
dom = xml.dom.minidom.parse('abc.xml')
#得到文檔元素對象
root = dom.documentElement
bb = root.getElementsByTagName('maxid')
b= bb[0]
print b.nodeName
bb = root.getElementsByTagName('login')
b= bb[0]
print b.nodeName
如何區分相同標簽名字的標簽:
復制代碼代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<maxid>4</maxid>
<login username="pytest" passwd='123456'>
<caption>Python</caption>
<item id="4">
<caption>測試</caption>
</item>
</login>
<item id="2">
<caption>Zope</caption>
</item>
</catalog>
<caption>和<item>標簽不止一個如何區分?
復制代碼代碼如下:
#coding=utf-8
import xml.dom.minidom
#打開xml文檔
dom = xml.dom.minidom.parse('abc.xml')
#得到文檔元素對象
root = dom.documentElement
bb = root.getElementsByTagName('caption')
b= bb[2]
print b.nodeName
bb = root.getElementsByTagName('item')
b= bb[1]
print b.nodeName
root.getElementsByTagName('caption') 獲得的是標簽為caption 一組標簽,b[0]表示一組標簽中的第一個;b[2] ,表示這一組標簽中的第三個。
四、獲得標簽屬性值
復制代碼代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<maxid>4</maxid>
<login username="pytest" passwd='123456'>
<caption>Python</caption>
<item id="4">
<caption>測試</caption>
</item>
</login>
<item id="2">
<caption>Zope</caption>
</item>
</catalog>
<login>和<item>標簽是有屬性的,如何獲得他們的屬性?
復制代碼代碼如下:
#coding=utf-8
import xml.dom.minidom
#打開xml文檔
dom = xml.dom.minidom.parse('abc.xml')
#得到文檔元素對象
root = dom.documentElement
itemlist = root.getElementsByTagName('login')
item = itemlist[0]
un=item.getAttribute("username")
print un
pd=item.getAttribute("passwd")
print pd
ii = root.getElementsByTagName('item')
i1 = ii[0]
i=i1.getAttribute("id")
print i
i2 = ii[1]
i=i2.getAttribute("id")
print i
getAttribute方法可以獲得元素的屬性所對應的值。
五、獲得標簽對之間的數據
復制代碼代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<maxid>4</maxid>
<login username="pytest" passwd='123456'>
<caption>Python</caption>
<item id="4">
<caption>測試</caption>
</item>
</login>
<item id="2">
<caption>Zope</caption>
</item>
</catalog>
<caption>標簽對之間是有數據的,如何獲得這些數據?
獲得標簽對之間的數據有多種方法,
方法一:
復制代碼代碼如下:
#coding=utf-8
import xml.dom.minidom
#打開xml文檔
dom = xml.dom.minidom.parse('abc.xml')
#得到文檔元素對象
root = dom.documentElement
cc=dom.getElementsByTagName('caption')
c1=cc[0]
print c1.firstChild.data
c2=cc[1]
print c2.firstChild.data
c3=cc[2]
print c3.firstChild.data
firstChild 屬性返回被選節點的第一個子節點,.data表示獲取該節點人數據。
方法二:
復制代碼代碼如下:
#coding=utf-8
from xml.etree import ElementTree as ET
per=ET.parse('abc.xml')
p=per.findall('./login/item')
for oneper in p:
for child in oneper.getchildren():
print child.tag,':',child.text
p=per.findall('./item')
for oneper in p:
for child in oneper.getchildren():
print child.tag,':',child.text
方法二有點復雜,所引用模塊也與前面的不一樣,findall用於指定在哪一級標簽下開始遍歷。
getchildren方法按照文檔順序返回所有子標簽。並輸出標簽名(child.tag)和標簽的數據(child.text)
其實,方法二的作用不在於此,它核心功能是可以遍歷某一級標簽下的所有子標簽。
⑹ python如何讀取多個Xml文件
使用open函數打開一個文件,參數1:文件路徑 ; 參數2:讀取方式 ; 返回一個文件描述符。
例如: file=open('abc.txt','r');
讀取文件內容用read函數,無參數。
例如:file.read()
如果想讀取多個則多open幾個文件即可。
⑺ python 解析xml需要什麼模塊
Python的標准庫中,提供了6種可以用於處理XML的包。
(1)xml.dom
xml.dom實現的是W3C制定的DOM API。如果你習慣於使用DOM API或者有人要求這這樣做,可以使用這個包。不過要注意,在這個包中,還提供了幾個不同的模塊,各自的性能有所區別。
DOM解析器在任何處理開始之前,必須把基於XML文件生成的樹狀數據放在內存,所以DOM解析器的內存使用量完全根據輸入資料的大小。
(2)xml.dom.minidom
xml.dom.minidom是DOM API的極簡化實現,比完整版的DOM要簡單的多,而且這個包也小的多。那些不熟悉DOM的朋友,應該考慮使用xml.etree.ElementTree模塊。據lxml的作者評價,這個模塊使用起來並不方便,效率也不高,而且還容易出現問題。
相關推薦:《Python教程》
(3)xml.dom.pulldom
與其他模塊不同,xml.dom.pulldom模塊提供的是一個「pull解析器」,其背後的基本概念指的是從XML流中pull事件,然後進行處理。雖然與SAX一樣採用事件驅動模型(event-driven processing model),但是不同的是,使用pull解析器時,使用者需要明確地從XML流中pull事件,並對這些事件遍歷處理,直到處理完成或者出現錯誤。
pull解析(pull parsing)是近來興起的一種XML處理趨勢。此前諸如SAX和DOM這些流行的XML解析框架,都是push-based,也就是說對解析工作的控制權,掌握在解析器的手中。
(4)xml.sax
xml.sax模塊實現的是SAX API,這個模塊犧牲了便捷性來換取速度和內存佔用。SAX是Simple API for XML的縮寫,它並不是由W3C官方所提出的標准。它是事件驅動的,並不需要一次性讀入整個文檔,而文檔的讀入過程也就是SAX的解析過程。所謂事件驅動,是指一種基於回調(callback)機制的程序運行方法。
(5)xml.parser.expat
xml.parser.expat提供了對C語言編寫的expat解析器的一個直接的、底層API介面。expat介面與SAX類似,也是基於事件回調機制,但是這個介面並不是標准化的,只適用於expat庫。
expat是一個面向流的解析器。您注冊的解析器回調(或handler)功能,然後開始搜索它的文檔。當解析器識別該文件的指定的位置,它會調用該部分相應的處理程序(如果您已經注冊的一個)。該文件被輸送到解析器,會被分割成多個片斷,並分段裝到內存中。因此expat可以解析那些巨大的文件。
(6)xml.etree.ElementTree(以下簡稱ET)
xml.etree.ElementTree模塊提供了一個輕量級、Pythonic的API,同時還有一個高效的C語言實現,即xml.etree.cElementTree。與DOM相比,ET的速度更快,API使用更直接、方便。與SAX相比,ET.iterparse函數同樣提供了按需解析的功能,不會一次性在內存中讀入整個文檔。ET的性能與SAX模塊大致相仿,但是它的API更加高層次,用戶使用起來更加便捷。
建議:在使用Python進行XML解析時,首選使用ET模塊,除非你有其他特別的需求,可能需要另外的模塊來滿足。
⑻ 使用python 讀取此XML文件,並把讀取的到內容寫到一個txt文件中;
#vim info.xml
<info>
<intro>信息</intro>
<listid='001'>
<head>auto_userone</head>
<name>Jordy</name>
</list>
</info>
#vim infoxmlparser.py
#!/usr/bin/python
#coding=utf-8
#PythonVersionPython2.6.5
fromxml.sax.handlerimportContentHandler
fromxml.saximportparse
classHeadlineHandler(ContentHandler):
in_headline=False
def__init__(self):
ContentHandler.__init__(self)
self.data=[]
self.file=open('info.txt','w')
self.file.writelines('id'+' '+'head ')
self.file.close()
defstartElement(self,name,attrs):
ifname=='list':
self.data.append(attrs['id'])
ifname=='head':
self.in_headline=True
defendElement(self,name):
ifname=='list':
self.file=open('info.txt','a')
self.file.writelines(self.data[0]+' '+self.data[1]+' ')
self.file.close()
self.data=[]
ifname=='head':
self.in_headline=False
defcharacters(self,string):
ifself.in_headline:
self.data.append(string)
if__name__=='__main__':
parse('info.xml',HeadlineHandler())
執行&結果
#pythoninfoxmlparser.py
#catinfo.txt
idhead
001auto_userone
⑼ 1、使用python讀取依據生成的xml文件,添加樣式表,最中生成一個html文件
#coding=utf8
#引入要用到的xml解析庫這里我們用比較輕量級的minidom就行了
importxml.dom.minidom
#定義一個html輸出模板
#後面我們只是要把這段html中的學生數據部分(<student_trs/>)換成xml中讀到的數據
template="""
<html>
<tableborder="1"style="width:100%;text-align:center;">
<tr>
<tdcolspan="4">學生信息</td>
</tr>
<student_trs/>
</table>
</html>
"""
#讀取xml文檔內容,這里假設是a.xml
dom=xml.dom.minidom.parse('a.xml')
#獲取xml中的所有student節點
student_nodes=dom.getElementsByTagName('student')
#初始化student_trs為空
student_trs=""
#遍歷每一條學生信息
fornodeinstudent_nodes:
#getAttribute用戶獲取節點的屬性,得到id屬性值即學號
#因為xml解析後是Unicode編碼的,所以這里要轉成utf8編碼,下面同理
sid=node.getAttribute("id").encode('utf-8')
#獲取所有子節點
children=node.childNodes
forchildinchildren:
#判斷子節點的名字為姓名、性別、專業的話,就採集其對應文本
ifchild.nodeName.encode('utf-8')=="姓名":
#使用。childNodes[0].nodeValue的方法得到節點的文本
name=child.childNodes[0].nodeValue.encode('utf-8')
ifchild.nodeName.encode('utf-8')=="性別":
sex=child.childNodes[0].nodeValue.encode('utf-8')
ifchild.nodeName.encode('utf-8')=="專業":
specialty=child.childNodes[0].nodeValue.encode('utf-8')
#組成html中的一行學生數據
student_tr="<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>"%(sid,name,sex,specialty)
#將這一行數據添加到總數據中
student_trs+=student_tr
#替換模板的<student_trs/>為我們上面所得到的html數據
html=template.replace("<student_trs/>",student_trs)
#輸入html結果到output.html
open("output.html","w").write(html)
#PS:你提供的xml數據有問題,確實了一個</students>標記
#正確的xml應該如下
"""
<?xmlversion="1.0"encoding="UTF-8"?>
<person>
<students>
<studentid="20140711">
<姓名>三</姓名>
<性別>男</性別>
<專業>計算機</專業>
</student>
</students>
</person>
"""
⑽ Python讀取xml文件總是報錯,小白,求解答
這種一般直接看最後一行:
xml.parsers.expat.ExpatError: XML declaration not well-formed: line 1, column 20
XML聲明格式不正確,第1行第20列(第20個字元),你自己按這個信息去檢查。