在fasta文件中组合具有相似标头的序列

时间:2018-06-05 03:29:33

标签: python

我有一个fasta文件,其中包含如下所示的序列:

>1 | A
actgcttctttcaa
>1 | B
cccaatggtac
>1 | C
ttccggaaa
>2 | A
actgcggcaa
>2 | B
cccaatac
>2 | C
tacatta
........
>1000 | A
actgactg
>1000 | B
aaccggttaacc
>1000 | C
ttcgttcg

我希望将标题与相同数字的序列组合在一起,例如

>1
actgcttctttcaacccaatggtacttccggaaa
>2
cccaataccccaatactacatta
............
>1000
actgactgaaccggttaaccttcgttcg

现在我不知道怎么做?有没有人可以帮忙解决这个问题?

1 个答案:

答案 0 :(得分:0)

在Python 3中:

from collections import defaultdict

with open(input_file_name) as f:
    d = defaultdict(list)
    lines = [l.strip() for l in f.readlines()]
    lines = [l for l in lines if l]
    if len(lines) % 2:
        print("WARNING: Odd number of lines")

    for line1, line2 in zip(lines[::2], lines[1::2]):
        n, *_ = line1[1:].split('|')
        d[int(n)].append(line2.strip())

    lines = ['>{:d}\n{:s}\n'.format(k, ''.join(v)) for k, v in d.items()]

with open(output_file_name, 'w') as f:
    f.writelines(lines)

以上代码假定对于给定的数字ID(例如,1,2,3,...),子字符串(或其他任何名称)按字母顺序排列(A ,B,C)。我想说的是,这不会起作用 if ,例如,

>1 | B
cccaatggtac
>1 | C
ttccggaaa
>1 | A
actgcttctttcaa

并且您希望仍然获得actgcttctttcaacccaatggtacttccggaaa