上海锐翌生物科技有限公司

服务电话:021-51001612

邮箱:support@realbio.cn

技术课堂

Biopython入门攻略
发布时间:2017-10-20 18:47   点击率:
叮咚!你的好友Biopython再次上线了。按照惯例,先放上项目主页感谢维护这个利器的各位大神~

https://github.com/biopython/biopython

生物信息分析的核心对象是序列,Biopython也是紧紧围绕“序列”这个对象做文章的,其定义的类包含了多种方法来支持常见的序列处理需求。而对于直接使用的各位分析生力军来说,我们大可不必关心这些方法是怎么实现的,毕竟对于序列这一处理对象,核心价值就在于对其共性找到通用的、需求量大的处理方法,这些大神们已经帮我们做了。本次教大家一些入门级的使用方法。

环境启动(这里以linux环境为例)

# source activate test_biopython
# python
其中source activate 后面跟着的是之前创建的虚拟环境名称(这里示例的是test_biopython),第二条命令启动python。

>>> from Bio.Seq import Seq
这样biopython的核心模块就导入成功了,那么如何操作序列?

如果我们想输出上面的序列test_seq屏幕,只需要用print(test_seq),刚才的序列就会打印出来,以上简单的几行命令就是Biopython的序列IO的简单例子。

处理序列
现在我们来处理一段真实的DNA序列,看看实际处理是怎样的:
>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG
...

经常做序列分析的童鞋对上述fasta文件自然是很熟悉,那么biopython怎么识别这样有规律格式的序列呢?

>>> from Bio import SeqIO
>>> for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
...    print(seq_record.id)
...    print(repr(seq_record.seq))
...    print(len(seq_record))
上面的代码是fasta序列解析的核心部分。SeqIO.parse用来解析各种序列文件,后面括号的第一项“ls_orchid.fasta”是实际要解析的序列文件,后面的是序列文件的格式比如fastq、fasta等。解析完成后用一个for循环,每次取出一条序列对象seq_record,这个对象包含了每条序列的相关信息:
seq_record.id: 序列的id,即fasta每条序列的第一行。
seq_record.seq: 序列本身。

输出结果如下:
>>> gi|2765658|emb|Z78533.1|CIZ78533
>>> Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', SingleLetterAlphabet())
>>> 740
...


如果只需要序列id部分的一部分,可以用split方法将id字符串用特定的分隔符分割,比如斜杠、竖线或者空格等,取出想要的部分即可。

由于输出的序列是标准的python字符串,我们可以用处理字符串的任意方法,比如给序列的重复碱基技术、取特定位置的碱基、取特定区间的碱基、互补序列、取反向序列等。这里限于主题biopython,仅写几个简单例子,需要这些功能的童鞋不妨百度搜索“python 字符串处理”、“python 字符串切片”等关键字来拓展学习。

>>> from Bio.Seq import Seq
>>> my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC")
>>> my_seq[4:12]
Seq('GATGGGCC')
>>> my_seq[0]
G
>>> my_seq[1]
A
>>> my_seq[2]
T
>>> my_seq.complement()
Seq('CTAGCTACCCGGATATATCCTAGCTTTTAGCG')
>>> my_seq[::-1]
Seq('CGCTAAAAGCTAGGATATATCCGGGTAGCTAG')

换句话说,处理序列,本质上就是在处理字符串,基于这一抽象我们可以做很多工作来发掘更多有价值的信息。