用BioPython基于序列过滤FASTA文件

2024-05-23 20:17:01 发布

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

我有一个fasta文件。从该文件中,我需要获取序列的末尾和/或开始处只包含GTACAGTAGG和{}的序列,并将它们放入一个新的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和caacggtttgcc的序列,并将它们放在一个新的fasta文件中。我对这个很陌生。我甚至不知道是否能做到。提前感谢您的帮助。在


Tags: 文件序列例子fasta末尾s1p0gagaaagggagaaaatagctacagacatgggagtgaaaggtaggaagaagagcgaagcagacattattca
3条回答

可能不是最好的方法,这取决于你的序列大小,但这将完成工作。在

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

虽然对于Python来说,检查一个字符串的结尾和/或开头是否具有特定的序列确实是一项非常简单的任务(请参阅^{}^{}),但这并没有解决从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')

我还可以推荐使用^{}(我正在开发的基于Python的蛋白质组学微框架)来操作FASTA文件:

^{pr2}$

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

相关问题 更多 >