如何使用Python从输入文本(PDB文件)的多行中收集单词?

如何使用Python从输入文本(PDB文件)的多行中收集单词?,python,Python,我正在编写一个Python脚本,它将单词收集到文本文件(PDB文件)中,然后将它们收集到短语中。然而,由于我只是一个编程新手,我在做这件事时遇到了巨大的困难。我知道怎么做,每次一行。我希望你们能给我一些帮助。求你了 文本包含蛋白质位点的信息。每个站点都有四条信息专线,如下所示: REMARK 800 REMARK 800 SITE_IDENTIFIER: CC1 REMARK 800 EVIDE

我正在编写一个Python脚本,它将单词收集到文本文件(PDB文件)中,然后将它们收集到短语中。然而,由于我只是一个编程新手,我在做这件事时遇到了巨大的困难。我知道怎么做,每次一行。我希望你们能给我一些帮助。求你了

文本包含蛋白质位点的信息。每个站点都有四条信息专线,如下所示:

REMARK 800  
REMARK 800 SITE_IDENTIFIER: CC1                                                 
REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE EDO A 326                 
REMARK 800                                                                      
REMARK 800 SITE_IDENTIFIER: DF8                                                 
REMARK 800 EVIDENCE_CODE: AUTHOR                                             
REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE HEM T 238
REMARK 800                                                                      
REMARK 800 SITE_IDENTIFIER: FC7                                                 
REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE NAG D 1001 

#and so on ...
扩展示例见以下链接(搜索“备注800”):

正如所观察到的那样

  • 1st行没有任何内容。(它只是将一个信息与下一个信息分开)
  • 第二个具有站点标识符。(如CC1)
  • 第三个证据代码。(例如软件)
  • 4th,一些残基信息。(例如江户A326)
这一模式在文本的大部分内容中都可以看到

我想做的是从四条连续的专线中的三条中收集一些单词,以这样的方式将它们放在一个短语中。必要的信息包括站点标识符证据代码,以及站点描述中的三个单词。因此,关于上面的文本摘录,产生的短语如下:

CC1 SOFTWARE EDO A 326
DF8 AUTHOR HEM T 238
FC7 SOFTWARE NAG D 1001

#and so on...
import re

f = open("3HDL.pdb", "r")

for line in f:
  m = re.search(r"REMARK 800 SITE_IDENTIFIER: (.+)", line)
  if m:
    site_id = m.group(1).strip()
  else:
    m = re.search(r"REMARK 800 EVIDENCE_CODE: (.+)", line)
    if m:
      evidence_code = m.group(1).strip()
    else:
      m = re.search(r"REMARK 800 SITE_DESCRIPTION: (.+)", line)
      if m:
        site_descrip = m.group(1).strip()
        print site_id, evidence_code, site_descrip

f.close()
有可能吗?如果是这样,你们能想象我怎么做吗

我试着这样做,但我觉得这根本行不通:

name_file = "3HDL.pdb"

pdb_file = open(name_file,"r")

for line in pdb_file:
    list = line.split()

    list_2=[]
    for j in range(0, 15):
        list_2.append("")

    if (list[0] == "REMARK" and list[1] == "800"):
        j=0
        while not j == len(list):
            list_2[j] = list[j]
            j+=1

        n=1
        if(list_2[0] == "REMARK" and list_2[1] == "800" and list_2[2] == "SITE_IDENTIFIER:"):
            n+=1
            print("Site", str(n) + ":", list_2[3])
            print("ok" + "\n")
正如你所看到的,我真的是一个初学者


很抱歉出现语法问题,非常感谢。

这里我们假设需要的内容是第2、3行的最后一个单词和第4行的最后3个单词

name_file = "3HDL.pdb"
pdb_file = open(name_file,"r")
output = []
for linenum, line in enumerate(pdb_file):
    if linenum % 4 ==0:
        continue
    elif linenum % 4 == 1:
        output.append(line.split()[-1])
    elif linenum % 4 == 2:
        output.append(line.split()[-1])
    elif linenum % 4 == 3:
        output.extend(line.split()[-3:])
for i in range(len(output)/6):
    print ' '.join(output[i:i+6])

像这样的怎么样:

CC1 SOFTWARE EDO A 326
DF8 AUTHOR HEM T 238
FC7 SOFTWARE NAG D 1001

#and so on...
import re

f = open("3HDL.pdb", "r")

for line in f:
  m = re.search(r"REMARK 800 SITE_IDENTIFIER: (.+)", line)
  if m:
    site_id = m.group(1).strip()
  else:
    m = re.search(r"REMARK 800 EVIDENCE_CODE: (.+)", line)
    if m:
      evidence_code = m.group(1).strip()
    else:
      m = re.search(r"REMARK 800 SITE_DESCRIPTION: (.+)", line)
      if m:
        site_descrip = m.group(1).strip()
        print site_id, evidence_code, site_descrip

f.close()
或者,如果要避免使用regex模块:

f = open("3HDL.pdb", "r")

for line in f:
  if line.startswith("REMARK 800"):
    if line.startswith("SITE_IDENTIFIER:", 11):
      site_id = line[28:].rstrip()
    elif line.startswith("EVIDENCE_CODE:", 11):
      evidence_code = line[26:].rstrip()
    elif line.startswith("SITE_DESCRIPTION:", 11):
      site_descrip = line[29:].rstrip()
      print site_id, evidence_code, site_descrip

f.close()

请注意,标记不是关键字。在标签列表中填入与你的问题相同的单词无助于分类。务必阅读选择标签时出现的说明!在我们开始否决你的问题之前。请向我们展示你自己解决这个问题的能力。好的。对不起,这是我第一次来这里。当然,詹姆斯。我将把我到现在为止所做的事情放在这里。看看附件的结构,这不会起作用,因为文件中有其他标记。正如我所检查的,备注800部分有确切的结构。
re
解决方案在一般情况下更好,但在这里有点过分。看看附件。您的解决方案不处理其他标记声明。因此,调用
pdb\u file=open(name\u file,“r”)
是错误的。
re
解决方案也更具可读性。我不认为这是过分的。正则表达式的良好使用。优雅的解决方案。只是为了好玩:OneLiner让你的朋友眼花缭乱,从上面的答案扩展为:
print'\n'。加入(''.join(i)for i in re.findall(“备注800站点标识符:(\w+)\s+备注800证据代码:(\w+)\s+备注800站点描述:残留物的绑定站点(\w+(\w+)),f.read())
ooga,硬编码字符串位置是一个非常难看的位置。为什么不进行
拆分
并获得负索引:无论如何,我认为正则表达式解决方案是最优雅的。@NhatNgo我同意。:-)感谢ooga和@Nhat Ngo的支持!这正是我想要的。正如一行所说,第一种选择似乎确实非常实用。然而,当我一个月前开始学习Python时,我更容易理解第二个选项,尽管它不是很优雅。但稍后我将搜索有关正则表达式的一些信息。你们能给我推荐一些信息来源吗?再一次,非常感谢!