如何使用Python从输入文本(PDB文件)的多行中收集单词?
我正在编写一个Python脚本,它将单词收集到文本文件(PDB文件)中,然后将它们收集到短语中。然而,由于我只是一个编程新手,我在做这件事时遇到了巨大的困难。我知道怎么做,每次一行。我希望你们能给我一些帮助。求你了 文本包含蛋白质位点的信息。每个站点都有四条信息专线,如下所示:如何使用Python从输入文本(PDB文件)的多行中收集单词?,python,Python,我正在编写一个Python脚本,它将单词收集到文本文件(PDB文件)中,然后将它们收集到短语中。然而,由于我只是一个编程新手,我在做这件事时遇到了巨大的困难。我知道怎么做,每次一行。我希望你们能给我一些帮助。求你了 文本包含蛋白质位点的信息。每个站点都有四条信息专线,如下所示: REMARK 800 REMARK 800 SITE_IDENTIFIER: CC1 REMARK 800 EVIDE
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时,我更容易理解第二个选项,尽管它不是很优雅。但稍后我将搜索有关正则表达式的一些信息。你们能给我推荐一些信息来源吗?再一次,非常感谢!