# 程序目的:由一条含简并碱基的核酸序列生成多条不包含简并碱基的核酸序列。
# 过程:
# 1.遍历每个碱基,查找其是否属于简并碱基,并返回列表(属于简并碱基)或者碱基(不属于简并碱基)。
# 2.如果属于简并碱基。循环遍历返回简并碱基的列表,并把碱基分别添加到reduce_primer列表的每个核酸序列的末尾。新生成的过渡列表list_mid替换原来的reduce_primer列表。
# 3.如果不属于简并碱基。则把返回的非简并碱基分别直接添加到reduce_primer列表的每个核酸序列的末尾。新生成的过渡列表list_mid替换原来的reduce_primer列表。
# 4.如此循环,直至遍历raw_primer完成。
# 5.保存结果到tsv表格。
# 创建一个将简并碱基映射到可能碱基的字典
degeneracy_map = {
'R': ['A', 'G'],
'Y': ['C', 'T'],
'M': ['A', 'C'],
'K': ['G', 'T'],
'S': ['G', 'C'],
'W': ['A', 'T'],
'H': ['A', 'T', 'C'],
'B': ['G', 'T', 'C'],
'V': ['G', 'A', 'C'],
'D': ['G', 'A', 'T'],
'N': ['A', 'T','G', 'C']
}
def resolve_degeneracy(degenerate_base):
"""函数说明:查询输入的碱基是否属于简并碱基,并返回列表(属于简并碱基)或者碱基(不属于简并碱基)"""
# 检查碱基是否是简并的
if degenerate_base in degeneracy_map:
# 如果是,从映射中选择一个碱基
return degeneracy_map[degenerate_base]
else:
# 如果不是,直接返回该碱基
return degenerate_base
def replace_list(list_A,list_B):
"""函数说明:删除list_A的所有列表元素,再使用list_B的元素来填充"""
list_A.clear()
for i in list_B:
list_A.append(i)
return list_A
def gc_content(s):
"""函数说明:读入DNA序列s,计算s中的GC含量"""
s=s.upper() #小写字母转换为大写
gcc = (s.count('C')+s.count('G'))/len(s)*100
return gcc
# seq='cCGCTTTAAA'
# num=gc_content(seq)
# print(num) #40.0
def reduce_primer(primer):
"""该函数用于还原简并引物,并返回多条简并引物的列表"""
primer=primer.upper() #小写字母转换为大写
reduce_primer=[]
for i in range(len(primer)): # 遍历引物的每个位置
list_mid=[] #保存新生成核酸序列的过渡列表
if len(resolve_degeneracy(primer[i]))>=2:
if i==0:
reduce_primer=resolve_degeneracy(primer[i])
# print(reduce_primer)
else:
for j in resolve_degeneracy(primer[i]):
for k in reduce_primer:
k+=j
list_mid.append(k)
replace_list(reduce_primer,list_mid)
# print(reduce_primer)
else:
if i==0:
reduce_primer.append(resolve_degeneracy(primer[i]))
# print(reduce_primer)
else:
for k in reduce_primer:
k+=resolve_degeneracy(primer[i])
list_mid.append(k)
replace_list(reduce_primer,list_mid)
# print(reduce_primer)
return reduce_primer
def raw_list_to_multiple_list(raw_list):
"""
函数说明:输入原始列表,返回多重列表。
输入原始列表,查询列表元素(核酸序列)的GC含量,然后把GC含量和列表元素保存到一个过渡列表,
每次循环的过渡列表都加入多重列表multiple_list,最后返回multiple_list。
"""
multiple_list=[]
for i in raw_list:
middle_list=[]
GC_percent=gc_content(i)
middle_list.append(round(GC_percent,4)) #保留4位小数
middle_list.append(i)
multiple_list.append(middle_list)
return multiple_list
def list_save_as_csv(list_input):
import csv
"""函数说明:把多重列表保存为primer.csv文件"""
# 创建CSV文件并打开以供写入数据
with open("primer.csv", mode="w") as file:
writer = csv.writer(file)
# 写入数据
for i in list_input:
writer.writerow(i)
# 关闭文件
file.close()
raw_primer='TWTTWTTWTTAWA' #输入含简并碱基的原始核酸序列。
primer=reduce_primer(raw_primer) #多条核酸序列的列表,里面的核酸序列不含简并碱基。
print(len(primer)) #查看列表里面序列的条数(全部都是不含简并碱基)
# print(primer)
multiple_list=raw_list_to_multiple_list(primer) #查询GC含量,并保存为多重列表。[[...],[...]...]
# print(multiple_list) #查看GC含量和序列
list_save_as_csv(multiple_list) #多重列表保存为primer.csv文件
备注:在网上没找到使用python写的该类脚本,故自己写一个并分享出来。