我正在尝试使用SIMAP数据库执行GO注释 Blast2GO注释。一切都很好,但我尝试时遇到问题 在条目编号所在的文件中查找入藏号 与他们的GO相关联。问题是脚本找不到 确实有输入文件中的数字。我尝试了几件事 没有好的结果(re.match,插入列表然后提取元素等) GO与条目号相关联的文件具有此结构(登录号,GO术语,blats2go分数):
1f0ba1d119f52ff28e907d2b5ea450db GO:0007154 79
1f0ba1d119f52ff28e907d2b5ea450db GO:0005605 99
python代码:
import re
from Bio.Blast import NCBIXML
from Bio import SeqIO
input_file = open('/home/fpiston/Desktop/test_go/test2.fasta', 'rU')
result_handle = open('/home/fpiston/Desktop/test_go/test2.xml', 'rU')
save_file = open('/home/fpiston/Desktop/test_go/test2.out', 'w')
fh = open('/home/fpiston/Desktop/test_go/Os_Bd_Ta_blat2go_fake', 'rU')
q_dict = SeqIO.to_dict(SeqIO.parse(input_file, "fasta"))
blast_records = NCBIXML.parse(result_handle)
hits = []
for blast_record in blast_records:
if blast_record.alignments:
list = (blast_record.query).split()
if re.match('ENA|\w*|\w*', list[0]) != None:
list2 = list[0].split("|")
save_file.write('%s\t' % list2[1])
else:
save_file.write('%s\t' % list[0])
for alignment in blast_record.alignments:
for hsp in alignment.hsps:
h = alignment.hit_def
for l in fh:
ls = l.split() #at this point all right
if h in ls: #here, 'h' in not found in 'fh'
print h
print 'ok'
save_file.write('%s\t' % ls[1])
save_file.write('\n')
hits.append(blast_record.query.split()[0])
misses =set(q_dict.keys()) - set(hits)
for i in misses:
list = i.split("|")
if len(list) > 1:
save_file.write('%s\t' % list[1])
else:
save_file.write('%s\t' % list)
save_file.write('%s\n' % 'no_match')
save_file.close()
这是修正 martineau (fh.seek(0))的代码:
#!/usr/bin/env python
import sys
import re
from Bio.Blast import NCBIXML
from Bio import SeqIO
input_file = sys.argv[1] #queries sequences in fasta format
out_blast_file = sys.argv[2] #name of the blast results file
output_file = sys.argv[3] #name of the output file
result_handle = open(out_blast_file, 'rU')
fh = open('/home/fpiston/Desktop/test_go/Os_Bd_Ta_blat2go', 'rU')
q_dict = SeqIO.to_dict(SeqIO.parse(open(input_file), "fasta"))
blast_records = NCBIXML.parse(result_handle)
save_file = open(output_file, 'w')
hits = []
for blast_record in blast_records:
if blast_record.alignments:
list = (blast_record.query).split()
if re.match('ENA|\w*|\w*', list[0]) != None:
list2 = list[0].split("|")
save_file.write('\n%s\t' % list2[1])
else:
save_file.write('\n%s\t' % list[0])
for alignment in blast_record.alignments:
for hsp in alignment.hsps:
hit = alignment.hit_def
save_file.write('%s\t' % hit)
fh.seek(0)
for l in fh:
ls = l.split()
if ls[0] in hit:
save_file.write('%s\t' % ls[1])
hits.append(blast_record.query.split()[0])
misses =set(q_dict.keys()) - set(hits)
for i in misses:
list = i.split("|")
if len(list) > 1:
save_file.write('\n%s\t' % list[1])
else:
save_file.write('\n%s\t' % list)
save_file.write('%s' % 'no_match')
save_file.close()
答案 0 :(得分:0)
我真的不知道你在这里谈论的是什么,但是注意到在for blast_record in blast_records:
和for alignment in blast_record.alignments:
外部循环中你有一个for l in fh:
但是永远不会用{转回文件{1}}任何地方,这意味着它只会在第一次执行时读取文件中的行 - 这似乎是不合逻辑的。
您可以通过在内循环之前添加fh.seek(0)
来解决此问题。虽然内循环第一次执行时是不必要的,但是需要以下所有时间,并且额外一次执行它不会伤害任何东西。