我已经解决了这个生物信息学问题多肉的部分,虽然我觉得有点笨拙。特别是,我把fasta信息处理成了Biopython's SeqIO.parse()将接受的形式,它会尖叫着进行优化。
所以我要问你一个问题。如何更好地将HTTP响应从Uniprot保存到SeqIO.parse()容易解析的内容中?
'''
Stephen Wist
to solve this problem: http://rosalind.info/problems/mprt/
'''
import sys, re # IO and motif finding
import urllib3 # get protein fasta from uniprot
from Bio import SeqIO, Seq # fasta parsing and manipulation
if len(sys.argv)<2:
print("need at least one uniprotID")
f = open("ros.fa", "w")
http = urllib3.PoolManager() # urllib3 takes care of stuff here
# get fasta of all given uniprotIDs
for item in sys.argv[1:]:
url = "http://www.uniprot.org/uniprot/" + item + ".fasta"
req = http.request("GET", url)
byte_string = req.data
string = byte_string.decode("utf-8")
f.write(string) # BioPython SeqIO.parse() won't work on the
# decoded byte_string
print( "\nreq.data:\n", req.data,
"\ndecoded req.data:\n", string)
f.close()
pattern = re.compile("[N][^P][S|T][^P]")
for seq in SeqIO.parse("ros.fa", "fasta"):
# keeping this here, it might be useful
# [(m.start(0), m.end(0)) for m in re.finditer(pattern, string)]
for match in re.finditer(pattern, str(seq.seq)):
print(match.start(0) + 1)发布于 2017-09-06 02:14:06
在破解argv时,如果愿意,您有机会使用析解析解析。
请将所有这些代码隐藏在def main():下,而不是创建许多顶级的全局代码,比如f。
与其使用f = open() ... f.close(),不如用这样的方式来表达:
with open('ros.fa', 'w') as f:
...你可能会有一些评论。标识符string是准确的,但有点模糊。最好是删除临时变量:
f.write(req.data.decode('utf-8'))总的来说,这段代码看起来像是完成了任务。
发布于 2017-09-06 16:11:48
在短时间内重复请求将在某些服务器上阻塞您的IP地址,即使您使用的是API。如果您最终想要扩展这条路由,您可能需要尝试下载全蛋白质组并将其解析到一个小块中,然后根据需要对其进行筛选和访问。这也将给你一个显着的性能提升。但是,随着时间的推移,您将需要更新数据库。
https://codereview.stackexchange.com/questions/174905
复制相似问题