序列对象

        生物信息学中的主要对象毫无疑问就是生物序列,在本章中,我们将介绍Biopython 中的技巧来处理序列--Seq 对象。

         序列从本质上将是像 AGTACACTGGT 这样的一系列字母,这看上去很自然,因为这是生物学文件格式中所看到的序列的最常见方式。

         在 Seq 对象和python 序列间有两个重要的不同点。


        首先, Seq 对象包含有一 些相对于 python 序列的不同的方法(例 如,reverse_complement()方法在核酸序列中使用)。


            第二,Seq 对象有一个重要的属性--字母表,它被用来描述序列字符串的意思,及如何解释。例如,AGTACACTGGT 是一个 DNA 序列,还是一个包含有

很多 AGCT 的蛋白质序列?

1. 序列和字母表

         字母表对象也许是使 Seq 对象不仅仅是一个序列的最重要的东西。 Biopython中现在可用的字母表在 Bio.Alphabet 模块中定义。我们将使用 IUPAC 字母表(http://www.chem.qmw.ac.uk/iupac/)来处理我们喜欢的对象: DNA, RNA 以及 Proteins。Bio.Alphabet.IUPAC 提供了蛋白质,DNA 和 RNA 的基本的定义,有一个基本的 IUPACProtein 类,同时有一个扩展的 ExtendedIUPACProtein 来提供像 Asx(asparagine or aspartic acid), “Sec” (selenocysteine), and “Glx”(glutamine or glutamic acid). 对于有提供基本字母的 IUPACUnambiguousDNA和提供每一种可能的模糊字母的 ExtendedIUPACDNA,它允许改进残基。类似的 ,RNA 也 由 两 种 字 母 表 形 式 表 示 : IUPACAmbiguousRNA或 者IUPACUnambiguousRNA.

          字母表类的优点有两个。第一,这给出了 Seq 对象包含的信息类型。第二,这给出了作为类型检查的一个强制的信息。既然我们知道我们所处理的,让我们看看如何使用这个类来做些有趣的工作。你可以像这样构造一个使用默认字母表的序列。

>>> from Bio.Seq import Seq
>>> my_seq = Seq("AGCCTCTAC")
>>> my_seq
Seq('AGCCTCTAC', Alphabet())
>>> my_seq.alphabet
Alphabet()

2. 序列像字符串一样起作用

像通常的 python 序列一样,我们可以对 Seq 对象进行很多分析,例如,得到其长度,或者重复等.

from Bio.Seq import Seq
from Bio.Alphabet import IUPAC

my_seq = Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC',IUPAC.unambiguous_dna)


你可以像 python 序列一样存取其元素,记住 python 从零开始计数。

>>> print my_seq[0] #first element
>>> print my_seq[2] #third element

>>> print my_seq[-1] #list element

Seq 对象也有一个.count()方法,像这样:

>>> len(my_seq)
32
>>> my_seq.count("G")
10
>>> float(my_seq.count("G") + my_seq.count("C")) / len(my_seq)

0.46875

你可以使用以上语句计算 GC 百分含量,记住 Biopython 已经把计算 GC 含量的函数内置了。查看 Bio.SeqUtils 模块。

2.1 序列分片

让我们来看一个更复杂点的例子,进行序列分片:
>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>>my_seq=Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC',
IUPAC.unambiguous_dna)
>>> my_seq[4:12]

Seq('GATGGGCC', IUPACUnambiguousDNA())

          有两点需要注意。首先,这沿袭了传统的 python 字符串。所以序列的第一个元素索引为 0(这对计算机科学来说很平常,但对生物学来说就不然)。当你进行切片时,包含第一个元素,而不包括最后一个,( 包括 4,不包括 12),和 python中的一样。当然不是世界上的每一个人都需要这种方式。主要的目的是和 python保持一致。第二个需要注意的是,分片是在序列数据字符串上进行的,但是产生

的新的另一个 Seq 对象保留了在原始 Seq 对象中的字母表信息。同样像 python序列一样,你可以使用起始,结束和距离。例如,我们可以得到这个 DNA 序列的第一,第二和第三位置序列。

>>> my_seq[0::3]

Seq('GCTGTAGTAAG', IUPACUnambiguousDNA())

>>> my_seq[1::3]
Seq('AGGCATGCATC', IUPACUnambiguousDNA())
>>> my_seq[2::3]
Seq('TAGCTAAGAC', IUPACUnambiguousDNA())
当然也可以使用负的步,反向进行:
>>> my_seq[::-1]
Seq('CGCTAAAAGCTAGGATATATCCGGGTAGCTAG',

IUPACUnambiguousDNA())

2.2 把 Seq 对象转化为字符串

如果你真的仅仅需要一个字符串,例如打印出来,或者写入一个文件,插入
一个数据库等,很容易就可以做到:

>>> my_seq.tostring()


'GATCGATGGGCCTATATAGGATCGAAAATCGC'

2.3 核酸序列及(反转)互补

>>> my_seq
Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC',IUPACUnambiguousDNA())


>>> my_seq.complement()

Seq('CTAGCTACCCGGATATATCCTAGCTTTTAGCG',IUPACUnambiguousDNA())


>>> my_seq.reverse_complement()

Seq('GCGATTTTCGATCCTATATAGGCCCATCGATC', IUPACUnambiguousDNA())


所有这些操作中,字母表属性保留。如果你碰巧想做些例如,一个蛋白质序列的反向互补的话,这是很有用的

>>> protein_seq = Seq("EVRNAK", IUPAC.protein)
13Biopython 中文指南
生物信息学论坛 http://www.bioxxx.cn 倾力奉献
>>> dna_seq = Seq("ACGT", IUPAC.unambiguous_dna)
>>> protein_seq.complement()
Traceback (most recent call last):
File "", line 1, in ?
File "/usr/local/lib/python2.4/site-packages/Bio/Seq.py", line 108, in complement
raise ValueError, "Proteins do not have complements!"
ValueError: Proteins do not have complements!

这里会报错!

2.4 连接或增加序列

>>> protein_seq + dna_seq
Traceback (most recent call last):
File "", line 1, in ?
File "/usr/local/lib/python2.4/site-packages/Bio/Seq.py", line 42, in __add__
raise TypeError, ("incompatable alphabets", str(self.alphabet),
TypeError: ('incompatable alphabets', 'IUPACProtein()', 'IUPACUnambiguousDNA()')
如果你真的想这样做,需要首先给这两个序列通用的字母表:
>>> from Bio.Alphabet import generic_alphabet
>>> protein_seq.alphabet = generic_alphabet
>>> dna_seq.alphabet = generic_alphabet
>>> protein_seq + dna_seq

Seq('EVRNAKACGT', Alphabet())

3 可变的 Seq 对象

像标准的 python 字符串一样,Seq 对象是只读的,或者用 python 术语来讲,是不可变的。除了使 Seq 对象表现的像一个字符串,同时也有一个有用的默认,因为在很多生物学应用中,你需要确认你不会改变你的序列数据:
>>> my_seq[5] = "G"
Traceback (most recent call last):
File "", line 1, in ?
AttributeError: 'Seq' instance has no attribute '__setitem__'
但是,你可以改变它成为一个可变的序列(一个可变的 Seq 对象),对它做任何处理:
>>> mutable_seq = my_seq.tomutable()
>>> print mutable_seq
MutableSeq('GATCGATGGGCCTATATAGGATCGAAAATCGC',IUPACUnambiguousDNA())
>>> mutable_seq[5] = "T"
>>> print mutable_seq
MutableSeq('GATCGTTGGGCCTATATAGGATCGAAAATCGC',IUPACUnambiguousDNA())
>>> mutable_seq.remove("T")
>>> print mutable_seq
15Biopython 中文指南
生物信息学论坛 http://www.bioxxx.cn 倾力奉献
MutableSeq('GACGTTGGGCCTATATAGGATCGAAAATCGC',
IUPACUnambiguousDNA())
>>> mutable_seq.reverse()
>>> print mutable_seq
MutableSeq('CGCTAAAAGCTAGGATATATCCGGGTTGCAG',

IUPACUnambiguousDNA())


4 转录和翻译

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>>
my_seq
=
Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC",
IUPAC.unambiguous_dna)
这里包含一个 unambiguous 字母表,要想转录,我们需要:
>>> from Bio import Transcribe
>>> transcriber = Transcribe.unambiguous_transcriber
>>> my_rna_seq = transcriber.transcribe(my_seq)
>>> print my_rna_seq
Seq('GAUCGAUGGGCCUAUAUAGGAUCGAAAAUCGC',IUPACUnambiguousRNA())
新的 RNA Seq 对象字母表被自然引出,在一次证明,Seq 对象的处理并不比处理一个简单的序列困难。你同样可以逆转录一个 RNA 序列:
>>> transcriber.back_transcribe(my_rna_seq)
Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC',IUPACUnambiguousDNA())

5. 与字符串一起工作

对于那些不想使用序列对象,在 Bio.Seq 中也有一些接受像 python 的字符串
一样的模块层的函数:
>>> 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*

但是,鼓励使用默认 Seq 对象的。





你可能感兴趣的:(biopython)