我有两个fasta文件,我希望将FileB.fasta中的较短序列与FileA.fasta中的原始序列进行匹配,以获取其坐标或位置。但我的输出格式不正确。谁能帮我?
FileA.fasta
>chr1:2000-2019
ACGTCGATCGGTCGACGTGC
FileB.fasta
>chr1:2000-2019
GATCGG
FileC.bed
chr1:2000-2019 6 11
代码
from Bio import SeqIO
output_file = open('fileC.bed','w')
for long_sequence_record in SeqIO.parse(open('fileA.fasta'), 'fasta'):
long_sequence = str(long_sequence_record.seq)
for short_sequence_record in SeqIO.parse(open('fileB.fasta'), 'fasta'):
short_sequence = str(short_sequence_record.seq)
if short_sequence in long_sequence:
start = long_sequence.index(short_sequence) + 1
stop = start + len(short_sequence) - 1
# print short_sequence_record.id, start, stop
output_line ='%s\t%i\t%i\n' % \
(short_sequence_record.id,start,stop)
output_file.write(output_line )
output_file.close()
FileC.bed的理想输出
chr1 2005 2011
答案 0 :(得分:2)
嗯,你正在为索引添加1,找到更短的序列 -
start = long_sequence.index(short_sequence) + 1 <--- notice the +1
不要这样做,应该没问题。另请注意,-1
变量不要stop
。
您应该从id中添加起始序列号。
示例 -
start = long_sequence.index(short_sequence) + int((short_sequence_record.id.split(':')[1].split('-')[0]))
stop = start + len(short_sequence)
对于记录的id
,如果您在:
之前不需要任何内容,那么您应该将ID分割为:
并取左侧部分(分割后为0索引字符串) )。
示例 -
output_line ='%s\t%i\t%i\n' % \
((short_sequence_record.id.split(':')[0]),start,stop)
output_file.write(output_line )
答案 1 :(得分:1)
更通用的解决方案: