我有一个fasta文件。从该文件中,我需要在序列的结尾和/或开始处获得包含GTACAGTAGG
和CAACGGTTTTGCC
的唯一序列,并将它们放入新的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文件中将它们取出。我对此很新。我甚至不确定它是否可以完成。提前感谢您提供任何帮助。
答案 0 :(得分:1)
Python有一个内置于名为startswith()的字符串的方法,还有一个名为endswith()的方法。所以你可以测试一下它是从一个开始到另一个结束,反之亦然。
答案 1 :(得分:1)
虽然检查字符串在结尾和/或开头是否具有某个序列对于Python来说确实是一个非常简单的任务(请参阅str.startswith
和str.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