在学习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())
网友评论