Biopython学习笔记(二)序列的分析

作者: 生信start_site | 来源:发表于2020-04-01 03:18 被阅读0次

    学习Python:最开始的开始(入门教程+软件安装)文章里我提到过一本针对python小白入门的书,看完那本书再看Biopython这一章的内容会非常容易理解。

    (1)Alphabet 对象

    听起来听奇怪的,也猜不出是什么意思。说明书表达的内容也很专业,但是根据我的理解,Biopython可以用Alphabet对象来对你输入的序列进行类型的定义和判断。这是什么意思呢?看下面的例子:

    >>> from Bio.Seq import Seq
    >>> my_seq = Seq("AGTACACTGGT")
    >>> my_seq
    Seq(’AGTACACTGGT’)
    >>> my_seq.alphabet
    Alphabet()
    

    上面你给my_seq赋值,是一串序列。然后你用.alphabet来查看你这串序列是DNA、RNA还是protein,但是返回的是Alphabet(),并没有任何说明。说明你在赋值的时候并没有说明这串序列是什么。但是如果你这样做:

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> my_seq = Seq("AGTACACTGGT", IUPAC.unambiguous_dna)
    >>> my_seq
    Seq(’AGTACACTGGT’, IUPACUnambiguousDNA())
    >>> my_seq.alphabet
    IUPACUnambiguousDNA()
    

    现在比较一下这段代码和上一段的区别。区别就是你在赋值的时候,后面说明了这段代码是DNA(IUPAC.unambiguous_dna)。所以当你用.alphabet来查看序列类型的时候,返回的值是IUPACUnambiguousDNA()。

    再比如说:

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> my_prot = Seq("AGTACACTGGT", IUPAC.protein)
    >>> my_prot
    Seq(’AGTACACTGGT’, IUPACProtein())
    >>> my_prot.alphabet
    IUPACProtein()
    

    这段代码应该很好理解,你指定了输入的序列是蛋白序列,所以返回的值是IUPACProtein()。

    (2)序列的索引

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    #将一串序列定义
    >>> my_seq = Seq("GATCG", IUPAC.unambiguous_dna)
    #下面这个代码请参考《编程小白的第一本 Python 入门书》里的第六章进行理解
    >>> for index,letter in enumerate(my_seq):
    ...     print("%i %s" % (index,letter)) #这里%i是指索引编码,%s指相对应的字符
    ... 
    0 G
    1 A
    2 T
    3 C
    4 G
    >>> print(len(my_seq)) #输出序列的字符长度
    5
    

    简单的说,上面代码中enumerate() 函数:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。上面的代码就将你输入的序列里每一个字符的编号标了出来。

    你还可以让它输出指定位置的字符,需要记住的是,python里第一位的位置是0,不是1:

    >>> print(my_seq[0]) #first letter
    G
    >>> print(my_seq[2]) #third letter
    T
    >>> print(my_seq[-1]) #last letter
    G
    

    上面的[-1]很难理解是不是,看下图就明白了:

    如果你想知道一段序列里有多少个"G"怎么办?看下面的代码:

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna)
    >>> len(my_seq)
    32
    >>> my_seq.count("G") #用count()来计算有多少个指定的字符
    9
    >>> 100 * float(my_seq.count("G") + my_seq.count("C")) / len(my_seq) #你还可以看一下你的序列里的GC含量
    46.875
    

    当然这里有一个更简单的方法求GC含量:

    >>> from Bio.SeqUtils import GC
    >>> GC(my_seq)
    46.875
    

    (3)如何获取部分序列

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna)
    >>> my_seq[4:12] #这里取索引位置为4的字符,到第12位,但不包含第12位。
    Seq(’GATGGGCC’, IUPACUnambiguousDNA())
    

    关于方括号里如何取第几位到第几位,可以参照《编程小白的第一本 Python 入门书》第36页内容。

    把序列从头到尾颠倒过来:

    >>> my_seq[::-1]
    Seq(’CGCTAAAAGCTAGGATATATCCGGGTAGCTAG’, IUPACUnambiguousDNA())
    

    (4)将你输入的序列变成fasta格式

    >>> str(my_seq) #先把序列变成字符串
    ’GATCGATGGGCCTATATAGGATCGAAAATCGC’
    >>> fasta_format_string = ">Name\n%s\n" % my_seq #这里的\n是换行符的意思,%s是“把后面的my_seq里的值放到这个地方”的意思
    >>> print(fasta_format_string)
    >Name
    GATCGATGGGCCTATATAGGATCGAAAATCGC
    <BLANKLINE>
    

    (5)序列的合并

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import generic_dna
    #比如你有多个序列需要合并
    >>> list_of_seqs = [Seq("ACGT", generic_dna), Seq("AACC", generic_dna), Seq("GGTT", generic_dna)]
    >>> concatenated = Seq("", generic_dna)
    >>> for s in list_of_seqs:
    ... concatenated += s
    ...
    >>> concatenated
    Seq(’ACGTAACCGGTT’, DNAAlphabet())
    

    还有个更简便的方法:

    >>> sum(list_of_seqs, Seq("", generic_dna))
    Seq(’ACGTAACCGGTT’, DNAAlphabet())
    

    (6)改变序列的大小写

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import generic_dna
    >>> dna_seq = Seq("acgtACGT", generic_dna)
    >>> dna_seq
    Seq('acgtACGT', DNAAlphabet())
    >>> dna_seq.upper()
    Seq('ACGTACGT', DNAAlphabet())
    >>> dna_seq.lower()
    Seq('acgtacgt', DNAAlphabet())
    

    需要注意的是IUPAC alphabets只能是大写,所以上面说明里用的是generic_dna,而不是IUPAC。所以给你一段代码自己体会:

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna)
    >>> dna_seq
    Seq(’ACGT’, IUPACUnambiguousDNA())
    >>> dna_seq.lower()
    Seq(’acgt’, DNAAlphabet())
    

    (7)(反向)互补序列

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna)
    >>> my_seq
    Seq(’GATCGATGGGCCTATATAGGATCGAAAATCGC’, IUPACUnambiguousDNA())
    >>> my_seq.complement()
    Seq(’CTAGCTACCCGGATATATCCTAGCTTTTAGCG’, IUPACUnambiguousDNA())
    >>> my_seq.reverse_complement()
    Seq(’GCGATTTTCGATCCTATATAGGCCCATCGATC’, IUPACUnambiguousDNA())
    

    (8)转录

    在讲这一块之前,先来复习一下关于转录的知识吧:

    生物过程里的转录是根据模板链进行的。反向互补形成mRNA序列。但是在python和Biopython里,直接拿DNA编码连来转成mRNA链,这样只需要把DNA编码链里的T换成U就行了。

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", IUPAC.unambiguous_dna)
    >>> coding_dna
    Seq(’ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG’, IUPACUnambiguousDNA())
    >>> messenger_rna = coding_dna.transcribe()
    >>> messenger_rna
    Seq(’AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG’, IUPACUnambiguousRNA())
    

    如果你想按照生物学的转录来,是什么代码呢?

    >>> template_dna.reverse_complement().transcribe()
    Seq(’AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG’, IUPACUnambiguousRNA())
    

    再将mRNA转换成DNA编码链:

    >>> messenger_rna.back_transcribe()
    Seq(’ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG’, IUPACUnambiguousDNA())
    

    (9)翻译

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", IUPAC.unambiguous_dna)
    >>> coding_dna
    Seq(’ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG’, IUPACUnambiguousDNA())
    #下面是翻译成氨基酸编码,按照脊椎动物线粒体的表格来翻译
    >>> coding_dna.translate(table="Vertebrate Mitochondrial")
    Seq(’MAIVMGRWKGAR*’, HasStopCodon(IUPACProtein(), ’*’))
    #由于脊椎动物线粒体的表格在https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi网站里排第二,你也可以直接写成table=2
    >>> coding_dna.translate(table=2)
    Seq(’MAIVMGRWKGAR*’, HasStopCodon(IUPACProtein(), ’*’))
    #如果你不想让它显示终止密码子,就是去掉星号,可以这样:
    >>> coding_dna.translate(table=2, to_stop=True)
    Seq(’MAIVMGRWKGAR’, IUPACProtein())
    

    再看下面这里例子,这是一段真实的CDS序列:

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import generic_dna
    >>> gene = Seq("GTGAAAAAGATGCAATCTATCGTACTCGCACTTTCCCTGGTTCTGGTCGCTCCCATGGCA" + \
    ... "GCACAGGCTGCGGAAATTACGTTAGTCCCGTCAGTAAAATTACAGATAGGCGATCGTGAT" + \
    ... "AATCGTGGCTATTACTGGGATGGAGGTCACTGGCGCGACCACGGCTGGTGGAAACAACAT" + \
    ... "TATGAATGGCGAGGCAATCGCTGGCACCTACACGGACCGCCGCCACCGCCGCGCCACCAT" + \
    ... "AAGAAAGCTCCTCATGATCATCACGGCGGTCATGGTCCAGGCAAACATCACCGCTAA",
    ... generic_dna)
    #GTG在细菌里既是起始密码子,又是正常的密码子,所以如果你不指定它是起始密码子的话,会变成这样:
    >>> gene.translate(table="Bacterial", to_stop=True)
    Seq(’VKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HHR’,ExtendedIUPACProtein())
    #如果你指定开头的GTG是起始密码子,那么翻译出来的序列就是:
    >>> gene.translate(table="Bacterial", cds=True)
    Seq(’MKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDH...HHR’,ExtendedIUPACProtein())
    

    (10)序列之间的比较

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> seq1 = Seq("ACGT", IUPAC.unambiguous_dna)
    >>> seq2 = Seq("ACGT", IUPAC.ambiguous_dna)
    >>> seq1 == seq2
    True
    

    然而如果你想把DNA和protein做比较的话,会有如下的显示:

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import generic_dna, generic_protein
    >>> dna_seq = Seq("ACGT", generic_dna)
    >>> prot_seq = Seq("ACGT", generic_protein)
    >>> dna_seq == prot_seq
    BiopythonWarning: Incompatible alphabets DNAAlphabet() and ProteinAlphabet()
    True
    

    (11)编辑序列

    假如你想把一段序列里的某一个碱基换一下,应该怎么做呢?

    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> my_seq = Seq("GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA", IUPAC.unambiguous_dna)
    >>> my_seq[5] = "G"
    Traceback (most recent call last):
    ...
    TypeError: ’Seq’ object does not support item assignment
    

    直接换是会报错的。你应该这样:

    >>> from Bio.Seq import MutableSeq
    >>> from Bio.Alphabet import IUPAC
    >>> mutable_seq = MutableSeq("GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA", IUPAC.unambiguous_dna)
    #把索引位置为5的碱基换成C
    >>> mutable_seq[5] = "C"
    >>> mutable_seq
    MutableSeq(’GCCATCGTAATGGGCCGCTGAAAGGGTGCCCGA’, IUPACUnambiguousDNA())
    #再把上面换掉的序列里第一个T去掉
    >>> mutable_seq.remove("T")
    >>> mutable_seq
    MutableSeq(’GCCACGTAATGGGCCGCTGAAAGGGTGCCCGA’, IUPACUnambiguousDNA())
    

    相关文章

      网友评论

        本文标题:Biopython学习笔记(二)序列的分析

        本文链接:https://www.haomeiwen.com/subject/ypzguhtx.html