试图找到有效的方法来删除fasta文件中的标头

时间:2014-10-24 14:38:13

标签: python sequence biopython fasta

我编写了一个丑陋的代码,删除了fasta标头,并创建了一个以蛋白质序列作为字符串的变量。我怎么能更高效地做到这一点?在biopython中有一个很好的方法吗?

f = open('protein1.fasta', 'r')
raw_samples = f.readlines()
f.close()

samples = ''

for elem in raw_samples:
    if elem[0] == '>':
        raw_samples = elem[1:].rstrip()
    else:
        samples += elem.rstrip()

print samples 

2 个答案:

答案 0 :(得分:2)

您想要做类似

的事情
sequences = []
with open('protein1.fasta', 'r') as fin:
    sequence = ''
    for line in fin:
        if line.startswith('>'):
            sequences.append(sequence)
            sequence = ''
        else:
            sequence += line.strip()

使用biopython,你可以做到

from Bio import AlignIO
alignment = AlignIO.read(open('protein1.fasta'), 'fasta')
sequences = [record.seq for record in alignment]

编辑:实际上,当我的序列中没有任何换行符时,我最常做的事情就是:

from itertools import izip_longest
sequences = []
with open('protein1.fasta', 'r') as fin:
    for header, seq in izip_longest(*[fin]*2):
        sequences.append(seq)

这里重要的是zip(*[fin]*2)将文件迭代器fin与自身([fin]*2 == [fin, fin])拉开。由于a。)文件迭代器的工作方式和b。)我们用它自己压缩它,你可以将zip操作视为

yield (fin.next(), fin.next())

一次产生两行,非常适合于序列没有换行符的fasta文件。

答案 1 :(得分:0)

使用biopython和字典来存储变量的示例,以防通过字典访问在您的情况下是有利的:

dct = {}
for seq_record in SeqIO.parse(open(infile.fasta), "fasta"):
    try:
        dct['samples'].append(str(seq_record.seq).upper())
    except:
        dct['samples'] = str(seq_record.seq).upper()

许多工具在fasta文件中引入换行,因此为了实现健壮性,我会使用biopython导入文件。 @wflynny biopython + list comprehension解决方案可能更有效,但是 如果你想拥有多个变量,我会使用字典方法,每个变量都链接到一个序列