2012-07-06 66 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