【问题标题】:reading token on python在 python 上读取令牌
【发布时间】:2012-07-06 15:43:37
【问题描述】:

我想从文本文档中读取标记并检查特定的关键字。我该怎么做? 例如我的文件如下所示:

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

(我想跳过第一行并在第二行搜索token,dbname必须等于GE3D。如果是我想存储stt号和结束号。)

*所以我这样做了,但我不知道为什么它只返回一个数字作为开始和结束,因为多个数字应该满足要求: 从 lxml 导入主目录

文件名 = 'inQ14591.txt'

with open(filename,'rb') as f:

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

打印(stt)

打印结束

【问题讨论】:

  • 你试过什么?
  • 看起来像XML,你试过用lxml写解析器吗?

标签: python token


【解决方案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

【讨论】:

  • 非常感谢 cha0site。这是否允许我从其中包含 dbname =GE3D 的文本部分中获取 stt 和 end 编号?我问的原因是我在一个文件上有多个类似的文本,有和没有 dbname ='GE3D'..再次感谢
  • @ChadD:只要“文本”(大部分)是有效的 XML,就可以。该循环将遍历每个具有dbnameGE3Dmatch 标记。
  • 我试过了,看看它是否打印数字列表,但它只打印一个数字作为开始,一个数字作为结束。 (我只是在您的代码下方添加 print stt 和 print end。)谢谢
  • @ChadD:嗯,是的,我看到您将 print 语句放在循环之外。我已经编辑了答案。如果你想要列表中的值,你可以这样做而不是打印。
【解决方案2】:

好像你可以用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 值,您需要找到带有 ln 的行,然后使用带有 stt 的标签,如下所示:

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

【讨论】:

  • 非常感谢 TankorSmash。我有很多类似的数据。如果它找到 dbname=GE3D 并从 ln stt="114" 捕获 114 并从 end="142" 捕获 dbname =GE3D 的 142 是否有可能。
  • 当然,您只需要使用soup.findAll()。看看这里的文档http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#The basic find method: findAll(name, attrs, recursive, text, limit, **kwargs) 掌握了窍门后真的很简单
  • 我尝试使用您的方法,但它说当我添加 stt_value... 和 end_value 时索引超出范围。
  • 确保您传递给findAll 的字符串是ln 而不是In。尝试像这样打印findAll 的结果:print soup.findAll('ln') 以确保您正在解析的列表不为空。
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2018-03-23
  • 2019-12-30
  • 2015-06-28
  • 2021-06-05
  • 2017-10-03
相关资源
最近更新 更多