python 對 xml 文件的解析

xml文件


xml

其中pathway為整個xml的根節(jié)點


xml結(jié)構(gòu)

整個xml結(jié)構(gòu)為

pathway

----entry

--------graphics

----entry

--------graphics

----entry

--------graphics

----....

----relation

--------subtype

----....

需求為講relation中的attrib中的entry1與entry2提取出來十艾,尋找entry中對應(yīng)的id

基本思路為:

1. 先獲取所有的relation節(jié)點幽纷,遍歷relation節(jié)點

2. 獲取當(dāng)前節(jié)點的attribute饰恕,獲取attrib的entry1寥枝、entry2屬性的值

3. 在entry節(jié)點中搜索entry id

4. 構(gòu)造最后所需的結(jié)果

在遍歷relation節(jié)點,每次都要對entry節(jié)點進(jìn)行搜索芽丹,比較浪費時間北启。

在此可以先構(gòu)造一個key為id,value為graphics節(jié)點 name 的entry字典拔第,之后可以遍歷relation的時候獲得的

entry1咕村、entry2可以直接訪問entry字典獲取值,就不需要多層for循環(huán)了~


在這里使用的xml解析包為 xml.etree.ElementTree

直接上代碼吧=蚊俺,=

沒有設(shè)置為markdown文本模式懈涛。。泳猬。 各位看官將就的看會吧批钠。。也沒幾行



import xml.etree.ElementTree as ET #解析xml文件的包

import pandas #寫入excel需要的包

tree = ET.parse('Pathway_5.xml') #打開xml文件得封,使用xml.etree進(jìn)行解析

root = tree.getroot() #獲取根節(jié)點

entry_list = root.findall('entry') #找到所有的entry節(jié)點

relation_list = root.findall('relation') #找到所有的relation節(jié)點

entry_dic = {} #構(gòu)造空字典

#對所有的entry節(jié)點進(jìn)行一次遍歷埋心,使用entry的id 作為 字典的key 使用entry內(nèi)的gene節(jié)點的name 作為字典的 value

#這步是為了避免之后每次都要對entry進(jìn)行遍歷查找

#避免了深層次的 for 循環(huán)嵌套

for i in entry_list:

? ? gene = i.findall('graphics') #查找當(dāng)前entry節(jié)點所有的gene節(jié)點,避免出現(xiàn)兩次

? ? if len(gene) == 1:

? ? ? ? gene = gene[0]

? ? ? ? if 'name' in gene.attrib:

? ? ? ? ? ? entry_dic[i.attrib['id']] = gene.attrib['name'] # 構(gòu)造key-value

? ? ? ? else:

? ? ? ? ? ? print(gene.attrib)

? ? ? ? ? ? entry_dic[i.attrib['id']] = 'none'

#為了寫入excel作準(zhǔn)備

entry1_name = []

entry2_name = []

subtype_name = []

#遍歷relation

for i in relation_list:

? ? #如果當(dāng)前relation節(jié)點不同時存在entry1和entry2則跳到下次for循環(huán)

? ? if 'entry1' not in i.attrib and 'entry2' not in i.attrib:

? ? ? ? print("False relation : %s" % str(relation_list.index(i)))

? ? ? ? continue

? ? #獲得 entry1 和 entry2 的id

? ? entry1_id = i.attrib['entry1']

? ? entry2_id = i.attrib['entry2']

? ? print(entry1_id,entry2_id)

? ? # 包含當(dāng)前relation節(jié)點的subtype節(jié)點出現(xiàn)多個的情況

? ? subtype_name_list = []

? ? for k in i.findall('subtype'):

? ? ? ? if 'name' in k.attrib:

? ? ? ? ? ? subtype_name_list.append(k.attrib['name'])

? ? ? ? else:

? ? ? ? ? ? subtype_name_list.append('')

? ? #將結(jié)果添加到之前列表忙上,pandas寫入excel需要列表

? ? entry1_name.append(entry_dic[entry1_id])

? ? entry2_name.append(entry_dic[entry2_id])

? ? subtype_name.append(' '.join(subtype_name_list))

? ? #寫入txt文件

? ? with open('d.txt','a+') as f:

? ? ? ? f.write('%s \t\t\t\t%s\t\t\t\t%s\n' % (entry_dic[entry1_id],entry_dic[entry2_id],' '.join(subtype_name_list)))

# #寫入 excel 文件

# file_name = 'outputs.xlsx' #文件名

# #構(gòu)造DataFrame結(jié)構(gòu)數(shù)據(jù) excel寫入需要DataFrame數(shù)據(jù)

# msg = pandas.DataFrame(data={'entry1_name':entry1_name,'entry2_name':entry2_name,'subtype_name':subtype_name})

# #寫入excel

# writer = pandas.ExcelWriter(file_name)

# msg.to_excel(writer,'Sheet1')

# writer.save()



幸好縮進(jìn)還是保留的....

在這里說下我用到的api

ET.parse('Pathway_5.xml') #解析文件~

tree.getroot() #獲取根節(jié)點

root.findall('entry') #找到當(dāng)前節(jié)點下的所有tag name 為entry 的節(jié)點

.attrib? #獲得當(dāng)前節(jié)點的屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拷呆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疫粥,更是在濱河造成了極大的恐慌茬斧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗逮,死亡現(xiàn)場離奇詭異项秉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慷彤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門娄蔼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怖喻,“玉大人,你說我怎么就攤上這事岁诉“辗溃” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵唉侄,是天一觀的道長。 經(jīng)常有香客問我野建,道長属划,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任候生,我火速辦了婚禮同眯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唯鸭。我一直安慰自己须蜗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布目溉。 她就那樣靜靜地躺著明肮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缭付。 梳的紋絲不亂的頭發(fā)上柿估,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音陷猫,去河邊找鬼秫舌。 笑死,一個胖子當(dāng)著我的面吹牛绣檬,可吹牛的內(nèi)容都是我干的足陨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娇未,長吁一口氣:“原來是場噩夢啊……” “哼墨缘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忘蟹,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤飒房,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后媚值,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狠毯,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年褥芒,在試婚紗的時候發(fā)現(xiàn)自己被綠了嚼松。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫡良。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖献酗,靈堂內(nèi)的尸體忽然破棺而出寝受,到底是詐尸還是另有隱情,我是刑警寧澤罕偎,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布很澄,位于F島的核電站,受9級特大地震影響颜及,放射性物質(zhì)發(fā)生泄漏甩苛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一俏站、第九天 我趴在偏房一處隱蔽的房頂上張望讯蒲。 院中可真熱鬧,春花似錦肄扎、人聲如沸墨林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旭等。三九已至,卻和暖如春雷则,著一層夾襖步出監(jiān)牢的瞬間辆雾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工月劈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留度迂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓猜揪,卻偏偏與公主長得像惭墓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子而姐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354