业余Python编码器试图在这里学习,所以我想问一下我的脚本是怎么回事。我真的无法解决它出错的地方。 (想想第24行或difference = "%s-%s [%d]" %( seq1[i], seq2[i], i)
)。
该函数是对一系列序列进行重命名,重命名它们(此位有效),然后将每个序列与参考序列(此处只是文件中的第一个序列)进行比较,如果序列中的字母不匹配参考打印差异和位置。但是,正如您在下面看到的那样,这是行不通的
这是一个模拟输入文件 - http://pastebin.com/AH2zxdBn
import re
from Bio.Alphabet import generic_dna, generic_protein
from Bio import SeqIO
def compare_seqs( seq1, seq2 ):
similar = 0
diff = 0
diff_positions = []
for i in range(0, len( seq1 )):
if ( seq1[ i ] != seq2[ i ]):
difference = "%s-%s [%d]" %( seq1[i], seq2[i], i)
diff_positions.append( difference )
# else:
# similar += 1
return ",".join( diff_positions )
new_seq = []
reference_sequence = ""
reference_name = ""
outfile = open("test_out.csv", 'w')
for record in SeqIO.parse(open('test.fa', 'ru'), 'fasta', generic_protein):
record_id = re.sub(r'\d+_(\d+_\d\#\d+)_\d+', r'\1', record.id)
if ( not reference_sequence ):
reference_sequence = record.seq
reference_name = record_id
#continue
print "\t".join([reference_name, record_id, compare_seqs(reference_sequence, record.seq)])
这是我得到的输出,这是不正确的,因为7065_8#4中的pos 454实际上= P
7065_8#1 7065_8#1
7065_8#1 7065_8#2
7065_8#1 7065_8#3
7065_8#1 7065_8#4 E-G [245]
7065_8#1 7065_8#5
答案 0 :(得分:2)
解决此问题的最佳方法是将其分解为更小的部分并验证每个部分。
这是一个最小差异实现:
def compare_sequences(seq1, seq2):
for index, (a, b) in enumerate(zip(seq1, seq2)):
if a != b:
yield index, a, b
这里有效:
print list(compare_sequences('abcdef', 'abddef'))
哪个给了我
[(2, 'c', 'd')]
您可以将此作为其工作的简单证据。我建议做的是将输入同步到你的函数中,并验证它是否按预期工作。
也许输入有空格或换行的问题,你不指望它会把一切都扔掉?