原始的输入文件:
Rosalind_1
GATTACA
Rosalind_2
TAGACCA
Rosalind_3
ATACA
# Finding a Shared Motif
# date:2020/5/29
# 这是我转载别人的文章,但是原始的我就不费劲找了,我只想好好
# 品一品这个脚本,以我小菜鸡的水平,我就是觉得写的很棒,
# 如果是大神,您就略过哈
###
首先下面这一段函数没有什么难度,就是把原始文件里面的序列
保存成列表的数据格式
###
def readfasta(filename, sample):
fa = open(filename, 'r')
fo = open(sample, 'w')
res = {}
rres = []
ID = ''
for line in fa:
# 如果是">"开头的,就创建一个key键
if line.startswith('>'):
ID = line.strip('\n')
res[ID] = ''
# 如果不是">"开头的,在这个key键下添加value值
else:
res[ID] += line.strip('\n')
# 把value值提取出,写入sample文件
for value in res.values():
rres.append(value)
fo.write(value + '\n')
#返回 ['TAGACCA','ATACA','GATTACA']
return rres
###
第一个高潮来了哈
###
def fragement(seq_list):
res = []
seq = seq_list[0] # TAGACCA
# 上面的代码 seq 取出原始文件的第一个序列,
# 这个无所谓,重要的是把这个序列所有的可能的正向组合全部排列出来
# 这里面作者用了两个 for 循环完成的功能
# 但是 第一个列表 s_seq是 从前往后切
# 从第一个列表 s_seq得到的子序列 是从后往前切
# 如果反应不过来,可以用 12345来试一试得到所有可能的正向组合
for i in range(len(seq)):
s_seq = seq[i:]
for j in range(len(s_seq)):
res.append(s_seq[:(len(s_seq) - j)])
# 返回res列表的所有组合
# T TA TAG TAGA TAGAC TAGACC TAGACCA
# A AG AGA
return res
def main(infile, sample):
seq_list = readfasta(infile, sample)
frags = fragement(seq_list)
# 这里是最后一个高潮了,坚持一下
# 首先这里的排序很重要,因为排序是从长到短排序,
# 排序的方法保证了下面迭代的时候发现的 motif 其实是最长的
# 最后的break对题目而言非常好,因为如果你的目的是得到唯一的最
# 长 motif,那么break就可以终止运行,但是会忽略同样长度的其它motif
frags.sort(key=len, reverse=True) # 从长到短排列
for i in range(len(frags)):
ans = []
for j in seq_list:
# 把"所有组合"匹配到"列表"里面,有些匹配1次,有些匹配2次,
# 匹配三次的就是share_motif
r = j.count(frags[i])
if r != 0:
ans.append(r)
# 判断匹配是否大于等于三次
if len(ans) >= len(seq_list):
# 打印匹配大于等于三次的
print(frags[i])
break
main('./Finding a Shared Motif', 'sample.txt')