序列比较功能无法按预期工作

时间:2014-09-18 17:02:07

标签: python python-2.7 bioinformatics biopython

业余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

1 个答案:

答案 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')]

您可以将此作为其工作的简单证据。我建议做的是将输入同步到你的函数中,并验证它是否按预期工作。

也许输入有空格或换行的问题,你不指望它会把一切都扔掉?