我编写了一个丑陋的代码,删除了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
答案 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解决方案可能更有效,但是 如果你想拥有多个变量,我会使用字典方法,每个变量都链接到一个序列