使用BioPython根据序列过滤FASTA文件

时间:2012-12-14 20:59:44

标签: python biopython fasta

我有一个fasta文件。从该文件中,我需要在序列的结尾和/或开始处获得包含GTACAGTAGGCAACGGTTTTGCC的唯一序列,并将它们放入新的fasta文件中。所以这是一个例子:

>m121012_054644_42133_c100390582550000001523038311021245_s1_p0/7/2516_3269
***GTACAGTAGG***GTACACACAGAACGCGACAAGGCCAGGCGCTGGAGGAACTCCAGCAGCTAGATGCAAGCGACTA
TCAGAGCGTTGGGTCCAGAACGAAGAACAGTCACTCAAGACTGCTTT***CAACGGTTTTGCC***

>m121012_054644_42133_c100390582550000001523038311021245_s1_p0/7/3312_3597
CGCGGCATCGAATTAATACGACTCACTATAGGTTTTTTTATTGGTATTTTCAGTTAGATTCTTTCTTCTTAGAGGGTACA
GAGAAAGGGAGAAAATAGCTACAGACATGGGAGTGAAAGGTAGGAAGAAGAGCGAAGCAGACATTATTCA

>m121012_054644_42133_c100390582550000001523038311021245_s1_p0/7/3708_4657
***CAACGGTTTTGCC***ACAAGATCAGGAACATAAGTCACCAGACTCAATTCATCCCCATAAGACCTCGGACCTCTCA
ATCCTCGAATTAGGATGTTCTCCCCATGGCGTACGGTCTATCAGTATATAAACCTGACATACTATAAAAAAGTATACCAT
TCTTATCATGTACAGTAGG***GTACAGTAGG***

>m121012_054644_42133_c100390582550000001523038311021245_s1_p0/7/4704_5021
***GTACAGTAGG***GTGGGAGAGATGGCAGAAAGGCAGAAAGGAGAAAGATTCAGGATAACTCTCCTGGAGGGGCGAG
GTGCCATTCCCTGTGGTCACTTATTCTAAAGGCCCCAACCCTTCAAC***CAACGGTTTTGCC***

>m121012_054644_42133_c100390582550000001523038311021245_s1_p0/8/4223_4358
AAATATTGGGTCAAAGAACCGTTACTTTTCTTATATATGCGGCGCGAGGTTTTATATACTGATAAGAACCTACGCCATGG
GACATCTAATTCAGAGGGAAGAAGGTCCATGTCTGTTTGGATGAAATTGAGTCTG

(添加*以突出显示)

我需要一些方法来获得在序列结束和/或开始时包含GTACAGTAGG和CAACGGTTTTGCC的唯一序列,并在新的fasta文件中将它们取出。我对此很新。我甚至不确定它是否可以完成。提前感谢您提供任何帮助。

4 个答案:

答案 0 :(得分:1)

Python有一个内置于名为startswith()的字符串的方法,还有一个名为endswith()的方法。所以你可以测试一下它是从一个开始到另一个结束,反之亦然。

答案 1 :(得分:1)

虽然检查字符串在结尾和/或开头是否具有某个序列对于Python来说确实是一个非常简单的任务(请参阅str.startswithstr.endswith),但这并未解决从FASTA文件中提取序列作为字符串。这里存在某些问题,例如序列必须与注释分开,并且它们可以跨越多行。因此,将字符串方法直接应用于文件的行将不会产生所需的结果。

这就是为什么您需要FASTA格式的实际解析器。解析器将处理FASTA文件,并为Python字符串提供注释和序列。 BioPython确实提供了一个,你可以这样做:

from Bio import SeqIO
def filter_records(source, substrings):
    for rec in source:
        if any(rec.seq.startswith(sub) or rec.seq.endswith(sub)
                 for sub in substrings):
             yield rec

substrings = ('GTACAGTAGG', 'CAACGGTTTTGCC')
SeqIO.write(filter_recors(SeqIO.parse('my.fasta', 'fasta'),
            'filtered.fasta', 'fasta')

我还建议使用pyteomics(我参与开发的基于Python的蛋白质组学微框架)来操作FASTA文件:

from pyteomics import fasta
def filter_fasta(source, substrings):
    for descr, seq in source:
        if any(seq.startswith(sub) or seq.endswith(sub) for sub in substrings):
            yield descr, seq

substrings = ('GTACAGTAGG', 'CAACGGTTTTGCC')
fasta.write(filter_fasta(fasta.read('my.fasta'), substrings), 'filtered.fasta')

答案 2 :(得分:1)

这是Biopython中的一种方法:

from Bio import SeqIO

source = 'fasta_file_name.fa'
outfile = 'filtered.fa'
sub1 ='GTACAGTAGG'
sub2 = 'CAACGGTTTTGCC'

def seq_check(seq, sub1, sub2):
    # basically a function to check whether seq starts or ends with sub1 or sub2
    return seq.startswith(sub1) or seq.startswith(sub2) or \
        seq.endswith(sub1) or seq.endswith(sub2)

seqs = SeqIO.parse(source, 'fasta')
filtered = (seq for seq in seqs if seq_check(seq.seq, sub1, sub2))
SeqIO.write(filtered, outfile, 'fasta')

我们正在使用生成器表达式(以'filtered'开头的行),因此过滤是在程序读取源文件时完成的。这具有节省内存的优点。

我们还创建了一个新函数来检查序列的开始和结束,以使程序更具可读性。从理论上讲,你可以在生成器表达式中进行检查,但这会使得行不必要很长。

希望有帮助:)。

答案 3 :(得分:1)

可能不是最佳方式,取决于序列的大小,但这将完成工作。

import re
data_file ="location_of_fasta_file"
sequence = ''
Valid = False
for line in open(data_file):
    line = line.rstrip()
    if re.match("^>",line):
        if re.findall('^GTACAGTAGG',sequence) or re.findall('GTACAGTAGG$',sequence) or re.findall('^CAACGGTTTTGCC',sequence) or re.findall('CAACGGTTTTGCC$',sequence):
            print header_line
            print sequence
        header_line=line
        sequence = ''
        continue
    else:
        sequence += line
# below is needed to allow printing of final sequence which is not followed by a new fasta entry
if re.findall('^GTACAGTAGG',sequence) or re.findall('GTACAGTAGG$',sequence) or re.findall('^CAACGGTTTTGCC',sequence) or re.findall('CAACGGTTTTGCC$',sequence):
    print header_line
    print sequence