zoukankan      html  css  js  c++  java
  • biopython

    转载
    Part 2  Biopython的重头戏-生物学中序列的处理

    Biopyhton的Seq和Python中标准字符串有两大重要的不同之处:首先,他们的处理方法不同。Seq适用于很多不同字符串的用的方法,如translate(),但是又有所不同。而且Biopython中加入了不同字符处理中没有的方法,如reverse_complement(); 第二,Seq模块中加入了重要的特性alphabet,这个对象可以解释序列代表的意思,即这个序列是一个DNA序列还是蛋白质序等。
     是alphabet对象使得Seq对象成为不同于普通字符串的重要标志。Alphabet在Bio.Alphabet中定义。我们用IUPAC alphabet来处理很对重要的对象:DNA,RNA, Proteins.
    Bio.Alphabet.IUPAC提供了写了的基本信息。比如对于常见蛋白质序列用IUPACProtein来定义,而对于人体中不常见的氨基酸序列则用ExtendedIUPACProtein来定义;DNA序列用IUPACUnambigousDNA来定义,对于特殊的DNA序列(如甲基化的DNA序列)则用ExtendedIUPACDNA来定义等等。
    现在我们可以来处理生物学序列了,但是你要先装上Biopython模块。
     
    1.   基本生物学序列的表示与处理
     
    a)    对于模糊不清的序列我们可以这样处理
    >>> from Bio.Seq import Seq  #import Seq 模块来处理序列
    >>> my_seq = Seq("AGTACACTGGT")  #定义自己的序列Seq()
    >>> my_seq
    Seq(’AGTACACTGGT’, Alphabet())  #这里不是像string那样单单显示‘’AGTA..‘’了
    #可以看到,这里的seq是包含Alphabet特性的,和普通序列不同
    >>> my_seq.alphabet Alphabet()
    my_seq.alphabet Alphabet()
     
    b)    对于要详细说明序列,就要用到alphabet中的详细特性了。定义DNA序列:
    >>> 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()  
     
    c)    定义蛋白质序列
    >>> 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()
     

    2.   像处理普通字符串那样处理生物学的序列
     
    a)    适用于普通String的方法,如
    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> my_seq = Seq("GATCG", IUPAC.unambiguous_dna)
    >>> for index, letter in enumerate(my_seq):  #索引,print等特性
    ...print index, letter
    0 G
    1 A
    2 T
    3 C
    4 G
    >>> print len(my_seq)  #拥有像不同字符串的处理方法,很酷吧!
    5
    >>> print my_seq[0] #first letter
    G
    >>> print my_seq[2] #third letter
    T
    >>> print my_seq[-1] #last letter
    G
    >>> "AAAA".count("AA")
    2
    >>> Seq("AAAA").count("AA")
    2
     
    b)对于特殊的生物学问题处理起来就很方便,如计算GC%:
    >>> 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")
    9
    >>> 100 * float(my_seq.count("G") + my_seq.count("C")) / len(my_seq)
    46.875
     
    C) 当然你可以用上面的方法计算GC%,但是Biopython中还有更方便的模块Bio.SeqUtils计算GC%
    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> from Bio.SeqUtils import GC
    >>> my_seq = Seq(’GATCGATGGGCCTATATAGGATCGAAAATCGC’,IUPAC.unambiguous_dna)
    >>> 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]
    Seq(’GATGGGCC’, IUPACUnambiguousDNA())  #得到的仍然是具有属性的
    >>> my_seq[0::3]
    Seq(’GCTGTAGTAAG’, IUPACUnambiguousDNA())  #从0开始,中间间隔3个去,下面同理
    >>> my_seq[1::3]
    Seq(’AGGCATGCATC’, IUPACUnambiguousDNA())
    >>> my_seq[2::3]
    Seq(’TAGCTAAGAC’, IUPACUnambiguousDNA())
     
    4.   将生物学序列转化成普通字符串
     
    方法1
    >>> str(my_seq)
    ’GATCGATGGGCCTATATAGGATCGAAAATCGC’
    >>> print my_seq
    GATCGATGGGCCTATATAGGATCGAAAATCGC
     
    方法2:将FASTA格式中的序列提取出来:
    >>> fasta_format_string = ">Name\n%s\n" % my_seq
    >>> print fasta_format_string
    >Name
    GATCGATGGGCCTATATAGGATCGAAAATCGC
     方法3:
    >>> my_seq.tostring()
    ’GATCGATGGGCCTATATAGGATCGAAAATCGC’
     
    5.   序列的拼接:
     
    >>> from Bio.Alphabet import IUPAC
    >>> from Bio.Seq import Seq
    >>> protein_seq = Seq("EVRNAK", IUPAC.protein)
    >>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna)
    >>> protein_seq + dna_seq
    Traceback (most recent call last):
    TypeError: Incompatible alphabets IUPACProtein() and IUPACUnambiguousDNA()
    #序列拼接的简单方法就是+,但是不同性质的序列是不可以相加的,所以DNA序列和蛋白序列相加会报错!可以像下面一样统一特性。
     
    >>> from Bio.Alphabet import generic_alphabet
    >>> protein_seq.alphabet = generic_alphabet
    >>> dna_seq.alphabet = generic_alphabet
    >>> protein_seq + dna_seq
    Seq(’EVRNAKACGT’, Alphabet())   #这里的Alphabet是特性变得模糊了
     
    另外对于一般的核苷酸序列特性和IUPAC DNA sequence相加也会使得结果变得模糊(为一般核苷酸序列特性)!如:
    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import generic_nucleotide
    >>> from Bio.Alphabet import IUPAC
    >>> nuc_seq = Seq("GATCGATGC", generic_nucleotide)
    >>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna)
    >>> nuc_seq
    Seq(’GATCGATGC’, NucleotideAlphabet())
    >>> dna_seq
    Seq(’ACGT’, IUPACUnambiguousDNA())
    >>> nuc_seq + dna_seq
    Seq(’GATCGATGCACGT’, NucleotideAlphabet())
     
    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())
    >>> "GTAC" in dna_seq
    False
    >>> "GTAC" in dna_seq.upper()
    True
     
    注意IUPAC alphabets仅仅识别大写字母:
    >>> 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())
     
    另外最普通的反转是这样:
    >>> my_seq[::-1]
    Seq(’CGCTAAAAGCTAGGATATATCCGGGTAGCTAG’, IUPACUnambiguousDNA())
     
    蛋白序列没有反转互补等特性:
    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> protein_seq = Seq("EVRNAK", IUPAC.protein)
    >>> protein_seq.complement()
    Traceback (most recent call last):
    ...
    ValueError: Proteins do not have complements!
     
     8.   重要的生物学过程之转录(DNA-mRNA)
     
    在讨论转录之前,先让我们熟悉一下转录的基本知识。首先要分清编码链和模板链。mRNA是与模板链互补配对的,mRNA的序列是和编码链相同的;DNA中的T在RNA中相应的为U,即DNA中A的互补配对碱基是RNA中的U;一般情况下默认是通过模板链3‘-5’,转录成mRNA是5‘-3’。
     
    以上可以总结为下图
    DNA coding strand (aka Crick strand, strand +1)
    5’ ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG 3’
    3’ TACCGGTAACATTACCCGGCGACTTTCCCACGGGCTATC 5’
    DNA template strand (aka Watson strand, strand −1)
     
    Transcription
     
    5’ AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG 3’
    Single stranded messenger RNA
     
    Biopython对于处理转录有很大的优势,如:
    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", IUPAC.unambiguous_dna)
    >>> coding_dna
    Seq(’ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG’, IUPACUnambiguousDNA())
    >>> template_dna = coding_dna.reverse_complement()    #编码链和模板链是互补配对的
    >>> template_dna
    Seq(’CTATCGGGCACCCTTTCAGCGGCCCATTACAATGGCCAT’, IUPACUnambiguousDNA())
    #应该是默认模板链的书写方式是从3‘-5’的。
     
    我们知道mRNA中没有T,通过模板链直接reverse.complement()是不能得到结果的,这是就要用到seq.transcribe()方法了。
    >>> messenger_rna = coding_dna.transcribe()
    >>> messenger_rna
    Seq(’AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG’, IUPACUnambiguousRNA())
     
    还可以直接用一句话搞定:
    >>> template_dna.reverse_complement().transcribe()
    Seq(’AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG’,
    IUPACUnambiguousRNA())
     
    对于反转录,也有相应的方法,反转录后得到的编码链的序列。
    >>> messenger_rna.back_transcribe()
    Seq(’ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG’, IUPACUnambiguousDNA())
     
    9.   重要的生物学过程之二翻译
     
    翻译是从mRNA到proteins的过程。真核起始密码子AUG,终止密码子UAG,UGA,UAA。原核和真核是不同的。
    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> messenger_rna = Seq("AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG", IUPAC.unambiguous_rna)
    >>> messenger_rna
    Seq(’AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG’, IUPACUnambiguousRNA())
    >>> messenger_rna.translate()
    Seq(’MAIVMGR*KGAR*’, HasStopCodon(IUPACProtein(), ’*’)) #*表示终止密码子,上个序列中存在两个终止密码子,不编码氨基酸。
     
    也可以直接从DNA翻译成为氨基酸序列
    >>> 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()
    Seq(’MAIVMGR*KGAR*’, HasStopCodon(IUPACProtein(), ’*’))
     
    以上的翻译是安装NCBI中的翻译表进行转换的,当然你可以指定用其他的译码方式。但是Biopython默认的是standard genetic code (NCBI table id 1).你可以自己指定
    如当你要处理线粒体的DNA时候,要这样:
    >>> coding_dna.translate(table="Vertebrate Mitochondrial")  #当是细菌的时候,应为Bacterial
    Seq(’MAIVMGRWKGAR*’, HasStopCodon(IUPACProtein(), ’*’)) #和默认的不同吧
    当你想指定用另一个表时,可以这样设置:
    >>> coding_dna.translate(table=2)
    Seq(’MAIVMGRWKGAR*’, HasStopCodon(IUPACProtein(), ’*’))
     
    当你想使遇到第一个密码子就停止翻译时(自然就是这样),你可以这样设置:
    >>> coding_dna.translate()
    Seq(’MAIVMGR*KGAR*’, HasStopCodon(IUPACProtein(), ’*’))
    >>> coding_dna.translate(to_stop=True)
    Seq(’MAIVMGR’, IUPACProtein())  #和前者不同吧
    >>> coding_dna.translate(table=2)
    Seq(’MAIVMGRWKGAR*’, HasStopCodon(IUPACProtein(), ’*’))
    >>> coding_dna.translate(table=2, to_stop=True) #以表2翻译,遇到第一个终止密码子即终止
    Seq(’MAIVMGRWKGAR’, IUPACProtein())
    当然你也可以指定终止符号:
    >>> coding_dna.translate(table=2, stop_symbol="@")
    Seq(’MAIVMGRWKGAR@’, HasStopCodon(IUPACProtein(), ’@’))
     
    然而当你的转录起始序列不是AUG时,即其他生物的密码和真核可能不一样,这时候也要设置:
    >>> gene.translate(table="Bacterial", to_stop=True)
     
    10. 翻译表
     
    这里我们紧紧关注两类翻译表:标准翻译表和脊椎动物线粒体转录表
    >>> from Bio.Data import CodonTable
    >>> standard_table = CodonTable.unambiguous_dna_by_name["Standard"]
    >>> mito_table = CodonTable.unambiguous_dna_by_name["Vertebrate Mitochondrial"]
    上面的命令代码和下面是等价的
    >>> from Bio.Data import CodonTable
    >>> standard_table = CodonTable.unambiguous_dna_by_id[1]
    >>> mito_table = CodonTable.unambiguous_dna_by_id[2]
     
    你可以将表显示出来:
    >>> print standard_table #这里就不显示结果了,太大了
     
    当然你也可以快速查询密码子所对应的氨基酸是什么:
    >>> mito_table.stop_codons
    [’TAA’, ’TAG’, ’AGA’, ’AGG’]
    >>> mito_table.start_codons
    [’ATT’, ’ATC’, ’ATA’, ’ATG’, ’GTG’]
    >>> mito_table.forward_table["ACG"]
    ’T’
     

    11.生物序列的比较:
     
    这里的序列和普通的序列不同,不尽要考虑序列还要考虑Alphabet特性
    >>> from Bio.Seq import Seq
    >>> from Bio.Alphabet import IUPAC
    >>> seq1 = Seq("ACGT", IUPAC.unambiguous_dna)
    >>> seq2 = Seq("ACGT", IUPAC.unambiguous_dna)
    >>> seq1 == seq2  #这个为什么不对呢,我也不知道
    False
    >>> seq1 == seq1
    True
    >>> id(seq1) == id(seq2)
    False
    >>> id(seq1) == id(seq1)
    True
    >>> str(seq1) == str(seq2)
    True
    >>> str(seq1) == str(seq1)
    True
     
    12.可变的对象:
     
    当你想改变一个序列中的序列时,怎么办呢
    你可以先试试:
    >>> 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     
    #报错了,这种直接的方法是不可行的,试试下面的方法:
    >>> mutable_seq = my_seq.tomutable()   #使得序列可变的一种方法。
    >>> mutable_seq
    MutableSeq(’GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA’, IUPACUnambiguousDNA())
    Alternatively, you
     
    当然你也可用下边一种方法直接生成可变序列:
    >>> from Bio.Seq import MutableSeq
    >>> from Bio.Alphabet import IUPAC
    >>> mutable_seq = MutableSeq("GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA", IUPAC.unambiguous_dna)
    >>> mutable_seq
    MutableSeq(’GCCATTGTAATGGGCCGCTGAAAGGGTGCCCGA’, IUPACUnambiguousDNA())
    >>> mutable_seq[5] = "C"
    >>> mutable_seq
    MutableSeq(’GCCATCGTAATGGGCCGCTGAAAGGGTGCCCGA’, IUPACUnambiguousDNA())
    >>> mutable_seq.remove("T")
    >>> mutable_seq
    MutableSeq(’GCCACGTAATGGGCCGCTGAAAGGGTGCCCGA’, IUPACUnambiguousDNA())
    >>> mutable_seq.reverse()
    >>> mutable_seq
    MutableSeq(’AGCCCGTGGGAAAGTCGCCGGGTAATGCACCG’, IUPACUnambiguousDNA())
     
    当然你也可以很容易的将上述生成的可变序列转换成只读模式:
    >>> new_seq = mutable_seq.toseq()
    >>> new_seq
    Seq(’AGCCCGTGGGAAAGTCGCCGGGTAATGCACCG’, IUPACUnambiguousDNA())
     
     13.未知序列对象
     
    当你有一段未知序列时候,你仅仅知道他的长度的时候,这个方法就用到了。
    >>> from Bio.Seq import UnknownSeq
    >>> unk = UnknownSeq(20)
    >>> unk
    UnknownSeq(20, alphabet = Alphabet(), character = ’?’)  #你也可以把?换成N等字符
    >>> print unk
    ????????????????????
    >>> len(unk)
    20
     
    你也可以针对性的处理未知序列:
    >>> unk_dna
    UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = ’N’)
    >>> unk_dna.complement()
    UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = ’N’)
    >>> unk_dna.reverse_complement()
    UnknownSeq(20, alphabet = IUPACAmbiguousDNA(), character = ’N’)
    >>> unk_dna.transcribe()
    UnknownSeq(20, alphabet = IUPACAmbiguousRNA(), character = ’N’)
    >>> unk_protein = unk_dna.translate()
    >>> unk_protein
    UnknownSeq(6, alphabet = ProteinAlphabet(), character = ’X’)
    >>> print unk_protein
    XXXXXX
    >>> len(unk_protein)
    6

    14.直接处理字符串
     
    对于那些不想使用上述方法的读者,也可以直接对字符串进行处理的:
    >>> from Bio.Seq import reverse_complement, transcribe, back_transcribe, translate
    >>> my_string = "GCTGTTATGGGTCGTTGGAAGGGTGGTCGTGCTGCTGGTTAG"
    >>> reverse_complement(my_string)
    ’CTAACCAGCAGCACGACCACCCTTCCAACGACCCATAACAGC’
    >>> transcribe(my_string)
    ’GCUGUUAUGGGUCGUUGGAAGGGUGGUCGUGCUGCUGGUUAG’
    >>> back_transcribe(my_string)
    ’GCTGTTATGGGTCGTTGGAAGGGTGGTCGTGCTGCTGGTTAG’
    >>> translate(my_string)
    ’AVMGRWKGGRAAG*’
    但是并不鼓励你用这种方法。
    详见百度空间:http://hi.baidu.com/ilovelittree/item/750a4502e606ae03a1312de1

  • 相关阅读:
    Javascript中String()和new String()的区别——JS的包装对象
    文言色彩的客套话之感想
    面试时候可以问的问题集锦
    ES6的原始类型数据——Symbol
    python
    python
    python
    python
    python
    python
  • 原文地址:https://www.cnblogs.com/djx571/p/9092840.html
Copyright © 2011-2022 走看看