完成基因序列(fasta格式)的提取,核苷酸计数,GC含量计算,DNA 翻译为 RNA,RNA 翻译为 蛋白质,反向序列获取的相关函数

from __future__ import division#这是计算gc含量需要的模块,需要在首行导入,否则会报错
import re#04_3  DNA 翻译为 RNA时会用得着

#01打开下载的文件
with open('sequence01.fasta') as file:
    for line in file:
        print (line)

#02把描述字段和序列分别提取并存储在字典中
fasta = {}
with open('sequence01.fasta') as file:
    sequence = ""
    for line in file:
        if line.startswith(">"):
            # 去除描述字段行中的\n和>
            name = line[1:].rstrip()
            print(name)#这里只显示描述,即字典里的键
            fasta[name] = ''#得到值
            continue
        # 去除序列字段行中的\n,并将所有字符规范为大写字符
        fasta[name] += line.rstrip().upper()#序列是描述的值
print (fasta)#显示字典
print(fasta[name])#显示值

#03用函数把02的代码组装起来,以便后续调用
def get_fasta(fasta_path):
	fasta = {}
	with open(fasta_path) as file:
	    sequence = ""
	    for line in file:
	        if line.startswith(">"):
	            # 去除描述字段行中的\n和>
	            name = line[1:].rstrip()
	            fasta[name] = ''
	            continue
	        # 去除序列字段行中的\n,并将所有字符规范为大写字符
	        fasta[name] += line.rstrip().upper()
	return fasta#返回的是字典
#调用03中的函数,完成02中的工作
get_fasta_result=get_fasta('sequence01.fasta')#文件路径是字符串
print(get_fasta_result)#调用03的函数返回的是字典
print(get_fasta_result[name])#取出字典中的值

#04拿到规范化的数据后,查看序列的生物学意义
#04_1核苷酸计数,碱基偏好性:
#该统计数值可以查看碱基偏好性。比如, 一定类型的小RNA会有特定的碱基偏好性,它的第一个碱基偏好U。可以用于评价数据质量。如果miRNA 第一碱基不是U偏好,说明数据或分析过程有问题。
# 核苷酸计数的函数
def nt_count(seq):
    ntCounts = []
    for nt in ['A', 'C', 'G', 'T']:
        ntCounts.append(seq.count(nt))#注意count函数用于list或者字符串,所以seq一定要符合特定的数据结构。
    return ntCounts
#调用核苷酸计数的函数
seq=get_fasta_result[name]#参数seq是字典中的值
nt_count_result= nt_count(seq)
print(nt_count_result)

#04_2 GC含量:
#(A+T)/(G+C)之比随DNA的种类不同而异。GC含量愈高,DNA的密度也愈高,同时热及碱不易使之变性,因此利用这一特性便可进行DNA的分离或测定。同时,物种的GC含量有着特异性,以此可以判断测序后的数据是否合格。
def cg_content(seq):
    total = len(seq)
    gcCount = seq.count('G') + seq.count('C')
    gcContent = format(float(gcCount / total * 100), '.6f')#保留小数点后六位
    return gcContent
#调用04_2的函数
seq=get_fasta_result[name]#参数seq是字典中的值
cg_content_result=cg_content(seq)
print(cg_content_result)

#04_3  DNA 翻译为 RNA:
def dna_trans_rna(seq):
    rnaSeq = re.sub('T', 'U', seq)
    return rnaSeq
#调用04_3的函数
seq=get_fasta_result[name]#参数seq是字典中的值,是DNA序列
dna_trans_rna_result=dna_trans_rna(seq)
print(dna_trans_rna_result)

#04_4 RNA 翻译为 蛋白质:
def rna_trans_protein(rnaSeq):
    codonTable = {
        'AUA':'I', 'AUC':'I', 'AUU':'I', 'AUG':'M',
        'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACU':'T',
        'AAC':'N', 'AAU':'N', 'AAA':'K', 'AAG':'K',
        'AGC':'S', 'AGU':'S', 'AGA':'R', 'AGG':'R',
        'CUA':'L', 'CUC':'L', 'CUG':'L', 'CUU':'L',
        'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCU':'P',
        'CAC':'H', 'CAU':'H', 'CAA':'Q', 'CAG':'Q',
        'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGU':'R',
        'GUA':'V', 'GUC':'V', 'GUG':'V', 'GUU':'V',
        'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCU':'A',
        'GAC':'D', 'GAU':'D', 'GAA':'E', 'GAG':'E',
        'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGU':'G',
        'UCA':'S', 'UCC':'S', 'UCG':'S', 'UCU':'S',
        'UUC':'F', 'UUU':'F', 'UUA':'L', 'UUG':'L',
        'UAC':'Y', 'UAU':'Y', 'UAA':'', 'UAG':'',
        'UGC':'C', 'UGU':'C', 'UGA':'', 'UGG':'W',
    }
    proteinSeq = ""
    for codonStart in range(0, len(rnaSeq), 3):
        codon = rnaSeq[codonStart:codonStart + 3]
        if codon in codonTable:
            proteinSeq += codonTable[codon]
    return proteinSeq
#调用04_4中的函数
rnaSeq=dna_trans_rna_result
rna_trans_protein_result=rna_trans_protein(rnaSeq)
print(rna_trans_protein_result)

#04_5获取反向序列
def reverse_comple(type, seq):
    seq = seq[::-1]
    dnaTable = {
        "A":"T", "T":"A", "C":"G", "G":"C"
    }
    rnaTable = {
        "A": "T", "U": "A", "C": "G", "G": "C"
    }
    res = ""
    if type == "dna":
        for ele in seq:
            if ele in seq:
                if type == "dna":
                    res += dnaTable[ele]
                else:
                    res += rnaTable[ele]
    return res
#调用04_5的函数
#DNA的反向序列
type1="dna"
seq1=get_fasta_result[name]
dna_reverse_comple_result=reverse_comple(type1, seq1)
print(dna_reverse_comple_result)

#RNA的反向序列
type2="rna"
seq2=dna_trans_rna_result
rna_reverse_comple_result=reverse_comple(type2, seq2)
print(rna_reverse_comple_result)

 [1]: https://blog.csdn.net/u011262253/article/details/88542804#基本以此博主为模板修改的,在此感谢。
 [2]: https://www.ncbi.nlm.nih.gov/nuccore/NC_000006.12?report=fasta&from=31164337&to=31170682&strand=true

你可能感兴趣的:(python与生信)