2012-07-06 62 views
1

我想從文本文件中讀取令牌並檢查特定的關鍵字。我會怎麼做? 例如我的文件看起來像這樣:在python上閱讀令牌

<protein id="Q11" name="HUMAN" length="655" crc64="30E1C1D138"> 
    <match id="G3DSA:3.30.160.60" name="ZC2f_H2/iegse_NA-bd" dbname="GE3D" status="T" evd="HMPfm"> 
     <ipr id="IPR013087" name="Zinc finger, H2-type/inrase, D-bindg" tpe="Dain" /> 
     <ln stt="114" end="142" sc="1.0E-8" /> 
    </match> 

(我想跳過第一行,並尋找對dbname必須等於GE3D第二行令牌如果是我想要存儲的STT數。 。和結束號碼)

*,所以我這樣做,但我不知道它爲什麼只返回我一數開始和換下場,因爲不止一個數量應滿足的要求:從LXML進口主菜

filename ='inQ14591.txt'

開放(文件名, 'RB')爲f:

root = etree.parse(f) 
for ln in root.xpath("/protein/match[@dbname='GE3D']/ln"): 
    start = ln.get("stt") 
    end = ln.get("end") 

打印(STT)

打印結束

+3

你試過了什麼? – 0605002 2012-07-06 15:44:26

+3

看起來像XML,你有沒有嘗試使用lxml編寫解析器? – 2012-07-06 15:46:16

回答

0

好像你可以用BeautifulSoup解析它,但我不知道你正在尋找每您的評論

from BeautifulSoup import BeautifulSoup 
text = '''<protein id="Q11" name="HUMAN" length="655" crc64="30E1C1D138"> 
    <match id="G3DSA:3.30.160.60" name="ZC2f_H2/iegse_NA-bd" dbname="GE3D" status="T" evd="HMPfm"> 
     <ipr id="IPR013087" name="Zinc finger, H2-type/inrase, D-bindg" tpe="Dain" /> 
     <ln stt="114" end="142" sc="1.0E-8" /> 
    </match>''' 

soup= BeautifulSoup(text) 

res=soup.findAll(dbname='GE3D') 

更新找到stt價值到底是什麼,你需要找到行再取標籤與stt像這樣:

stt_value = soup.findAll('ln')[0]['stt'] # u'114' 
end_value = soup.findAll('ln')[0]['end'] # u'142' 
+0

非常感謝TankorSmash。我有很多類似這樣的數據。如果發現dbname = GE3D,並且在具有dbname = GE3D的節點上捕獲114從ln stt =「114」和142從end =「142」捕獲它,是否可能? – 2012-07-06 16:02:05

+0

當然,你只需要玩'soup.findAll()'。看看這裏的文檔'http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#基本的find方法:findAll(name,attrs,遞歸,文本,限制,** kwargs)'這是非常簡單的,你得到它的竅門 – TankorSmash 2012-07-06 16:20:33

+0

我試着用你的方法,但它說,當我添加stt_value ...和end_value時,索引超出範圍。 – 2012-07-06 17:26:05

1

這看起來很像XML,你可以用它來你的優勢。

from lxml import etree 

filename = "somefilename" # change this 

with open(filename, 'rb') as f: 
    root = etree.parse(f) 
    for ln in root.xpath("/protein/match[@dbname='GE3D']/ln"): 
     stt = ln.get("stt") 
     end = ln.get("end") 
     print "%s, %s" % (stt, end,) 
     # do something else with stt and end 
+0

非常感謝cha0site。這是否允許我使用dbname = GE3D中的文本部分獲取stt並結束編號?我問的原因是,我有一個類似的文字多個像上面一樣的文件有和沒有dbname ='GE3D'..再次感謝 – 2012-07-06 16:16:00

+0

@ChadD:只要「文本」是(大部分)有效的XML,是的。循環將迭代每個具有'GE3D'的'dbname'的'match'標記。 – cha0site 2012-07-06 16:24:34

+0

我試了一下,看它是否打印數字列表,而是隻打印一個數字開始和一個數字結束。 (我只是在你的代碼下面加上print stt和print end)謝謝 – 2012-07-06 17:23:25