Python 在循环中连接fasta文件

Python 在循环中连接fasta文件,python,biopython,Python,Biopython,我有多个fasta文件,其中有多个具有相同长度序列的个人。我想做的是沿着fasta文件创建物种序列的串联 在循环中:如果在下一个文件中找到一个物种,我连接它的序列,如果没有,我连接间隙“-”,长度与序列的其余部分相同。查看文件是否对齐 species_list = [] files = [file for file in glob.glob('~/*.fa')] for aln in files: with open (aln, 'rU') as multispecies:

我有多个fasta文件,其中有多个具有相同长度序列的个人。我想做的是沿着fasta文件创建物种序列的串联

在循环中:如果在下一个文件中找到一个物种,我连接它的序列,如果没有,我连接间隙“-”,长度与序列的其余部分相同。查看文件是否对齐

species_list = []
files = [file for file in glob.glob('~/*.fa')]
for aln in files:
    with open (aln, 'rU') as multispecies:
        sequences = SeqIO.parse(multispecies, 'fasta')
        for species in sequences:
            species_list.append(species.id)

species_list=list(set(species_list))
#print(species_list)

concat = {}
for aln in files:
    #print(aln)
    dict = {}
    with open (aln, 'rU') as multispecies:
        sequences = SeqIO.parse(multispecies, 'fasta')
        names = []
        for fasta in sequences:
            names.append(fasta.id)
            dict[fasta.id] = fasta.seq
        count_species = 0
        for i in species_list:
            if i in names:
                count_species = count_species + 1
                print('>' + i + '\n' + dict[i])
                gap = int(len(dict[i]))
                concat[i] += dict[i]    #I cannot find a way to concatenate here
            else:
                print('>' + i + '\n' + '-'*gap)
                concat[i] += '-'*gap #I cannot find a way to concatenate here

您的concat应该是一个defaultdict,或者通过创建某种风格的iterable(可能是str,或者在本例中最好是一个列表)来处理缺少的键。然后可以使用新值扩展iterable:

# list-based
concat.setdefault(i, []).extend(dict[i]) # should work if you keep the data in a list
# string-based
concat[i] = concat.get(i, '') + dict[i]

不过,基于字符串的方法效率极低,因为每次连接时都必须从头开始重新构建字符串。如果你需要一个字符串,那么你可以把它列成一个列表。一旦你建立了它,就加入它。

很好的解决方案,我仍然不明白为什么我的字典concat需要使用“get”。它可以不向字典添加任何内容,因为字典是在循环之外创建的。Dicts不支持开箱即用的添加。您只能在确实支持它的值上使用它,即对于像{'a':2}这样的dict1,您可以执行dict1['a']+=3,但不能执行dict2+={'a':3}将新项添加到空dict中。您不能假设在FASTA中遇到dict中的键之前知道它们,因此,尽管您可以在适当的键下烘焙空列表,你不应该。因此,如果需要,您可以使用“get”创建一个新的空列表,并向其中添加内容。太好了,谢谢。我部分解决了我的问题。起初,它按照我所希望的那样工作,但我运行代码越多,不同的串联不仅得到正确的结果,而且有时它无法识别变量,有时甚至会识别。我想知道这是否是因为我的代码中有一些bug。。?很奇怪。我检查过我使用的是Python3.5.2I,我无法分析您现在的问题到底是什么。请提供示例和/或代码。