Python:如何比较fasta文件中的多个序列?

时间:2016-12-08 16:49:56

标签: python for-loop biopython fasta

我对python的编程世界很陌生,我正在尝试编写一个脚本,给定一个FASTA文件,将相互比较序列并对它们进行评分(如果序列中的核苷酸位置A与序列B的相同位置的核苷酸匹配,然后例如得分上升2。到目前为止,我得到了这个:

from Bio import SeqIO


def sequence_compare(file):
    seq_records = SeqIO.parse(file, "fasta") 
    for record in seq_records:
        len1 = len(str(record.seq))
        sequence1 = str(record.seq)
        print(sequence1)
        for record in seq_records:
            len2= len(str(record.seq))
            sequence2 = str(record.seq)
            print(sequence2)
            a = 0
            for pos in range (0,min(len1,len2)) :
                if sequence1[pos] == sequence2[pos]:
                    a+= 2
                if sequence1[pos] != sequence2[pos]:
                    a+= -1
                if sequence1[pos] == sequence2[pos] == '-':
                    a+= -2
            print(a)

它为包含3个序列的Fasta文件提供的输出:

ACTGACTGACTGACTGACTG
ACTGACTGACTG-ACTGACT
16
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-5

在我看来,第一个for循环只循环一次而第二个for循环不以第一个序列开始。

期望的输出是将每个序列相互比较并评分。因此,序列1与序列1及其得分进行比较,序列1与序列2及其得分,序列1与序列3及其得分等进行比较...

如果有人可以帮助我,那将非常感激!

1 个答案:

答案 0 :(得分:1)

您的代码不起作用的原因是您对内部和外部循环使用相同的循环变量record。您可能希望将其分别更改为record1record2

但更好的是,python支持在itertools.combinations()中进行成对组合,因此可以避免嵌套循环。

此外,最好将评分算法转移到单独的函数中。

考虑到上述两个变化,这里是代码:

from Bio import SeqIO
from itertools import combinations


def score(sequence1, sequence2):
    a = 0
    for pos in range(0, min(len(sequence1), len(sequence2))):
        if sequence1[pos] == sequence2[pos]:
            a += 2
        if sequence1[pos] != sequence2[pos]:
            a += -1
        if sequence1[pos] == sequence2[pos] == '-':
            a += -2
    return a


def sequence_compare(file):
    seq_records = SeqIO.parse(file, "fasta")
    for record1, record2 in combinations(seq_records, 2):
        sequence1 = record1.seq
        sequence2 = record2.seq
        a = score(sequence1, sequence2)
        print(sequence1)
        print(sequence2)
        print(a)