在循环中连接fasta文件

2024-04-27 01:06:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个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

Tags: 文件inidfor序列filesdictlist
1条回答
网友
1楼 · 发布于 2024-04-27 01:06:58

您的concat应该是defaultdict,或者通过创建某种风格的iterable来处理缺少的键,可能是str,或者在本例中最好是一个list。然后可以使用新值扩展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]

但是基于字符串的方法效率非常低,因为每次连接都必须从头开始重建字符串。如果你需要一个字符串,你总是可以把它列为一个列表。一旦你完成构建,就加入它。在

相关问题 更多 >