Biopython

Biopython项目包含一系列用于计算生物学和生物信息学的非商业性Python工具，是一个国际性开发者协会所创建的开源软件集。其中包含表示生物序列和序列注释的类，且能够读取和写入多种文件格式。它还允许通过编程访问在线的生物学数据库，例如美国国家生物技术信息中心（NCBI）数据库。单独模块还能使Biopython的功能扩展到序列比对、蛋白质结构、群体遗传学、系统发生学、序列基序和机器学习。Biopython项目意图减少计算生物学中的代码重复问题，并与相似项目一样以Bio为前缀命名。

## 历史

Biopython的开发始于1999年，并于2000年7月首次发布。同时期被开发的同类项目还有BioPerl、BioRuby和BioJava，这些项目的命名都体现了开发所使用的编程语言。该项目的早期开发人员包含Jeff Chang、Andrew Dalke和Brad Chapman，至今有100余人做出贡献。2007年时建立了类似的Python项目PyCogent。

Biopython最初可以访问、索引和处理生物序列文件，这也是其主要目标。在之后几年中，新增的其他模块使其功能也涵盖其他生物学领域（见主要特点和示例）。

1.77版本起，Biopython项目结束对Python 2的支持。

## 设计

Biopython尽可能遵循Python语言的惯例，以便Python用户轻松使用。例如，`Seq`和`SeqRecord`对象可以通过切片进行操作，与Python的字符串和列表相似。其功能设计也与其他Bio*项目（如BioPerl）相似。

Biopython的每个功能区可读写常见的文件格式，并且许可证宽松，能与其他多数软件的许可证兼容，因此能在许多软件项目中使用Biopython。

## 主要特点和示例

### 序列

Biopython的一个核心概念是由`Seq`类表示的生物序列。`Seq`对象与Python字符串很相似：它支持Python切分符号，可与其他序列连接，并且不可变。此外，它有序列专用的方法，并能指定要使用的特定的生物字母表。

```pycon
>>> # 该脚本创建 DNA 序列并执行一些典型的操作
>>> from Bio.Seq import Seq
>>> dna_sequence = Seq("AGGCTTCTCGTA", IUPAC.unambiguous_dna)
>>> dna_sequence
Seq('AGGCTTCTCGTA', IUPACUnambiguousDNA())
>>> dna_sequence[2:7]
Seq('GCTTC', IUPACUnambiguousDNA())
>>> dna_sequence.reverse_complement()
Seq('TACGAGAAGCCT', IUPACUnambiguousDNA())
>>> rna_sequence = dna_sequence.transcribe()
>>> rna_sequence
Seq('AGGCUUCUCGUA', IUPACUnambiguousRNA())
>>> rna_sequence.translate()
Seq('RLLV', IUPACProtein())
```

### 序列注释

`SeqRecord`类以`SeqFeature`对象的形式描述序列以及名称、描述和特征等信息。每个`SeqFeature`对象指定特征的类型及其位置。特征类型可以是“gene”、“CDS”（编码序列）、“repeat_region”、“mobile_element”或其他，特征在序列中的位置可以是精确的或近似的。

```pycon
>>> # 该脚本从文件中加载带注释的序列并查看其部分内容。
>>> from Bio import SeqIO
>>> seq_record = SeqIO.read("pTC2.gb", "genbank")
>>> seq_record.name
'NC_019375'
>>> seq_record.description
'Providencia stuartii plasmid pTC2, complete sequence.'
>>> seq_record.features[14]
SeqFeature(FeatureLocation(ExactPosition(4516), ExactPosition(5336), strand=1), type='mobile_element')
>>> seq_record.seq
Seq("GGATTGAATATAACCGACGTGACTGTTACATTTAGGTGGCTAAACCCGTCAAGC...GCC", IUPACAmbiguousDNA())
```

### 输入输出

Biopython可以读写多种常见的序列格式，包括FASTA、FASTQ、GenBank、Clustal、PHYLIP和NEXUS。读取文件时，文件中的描述性信息会填充Biopython类的成员，例如`SeqRecord`，因此可以将某种文件格式的记录转换成其他格式。

超大的序列文件可能占满计算机的内存资源，因此Biopython提供了多种选项来访问大型文件中的记录。文件可以完全加载到Python数据结构（例如列表或字典）的内存中，以占用内存为代价提供快速访问。也可以按需从磁盘读取文件，这样访问性能较差，但内存用量较低。

```pycon
>>> # 该脚本加载一个包含多个序列的文件，并以不同的格式保存每个序列。
>>> from Bio import SeqIO
>>> genomes = SeqIO.parse("salmonella.gb", "genbank")
>>> for genome in genomes:
...     SeqIO.write(genome, genome.id + ".fasta", "fasta")
```

### 访问在线数据库

Biopython用户可以通过Bio.Entrez模块从NCBI数据库下载生物学数据。Entrez搜索引擎提供的各项功能都可通过该模块的功能实现，包括搜索、数据记录下载。

```pycon
>>> # 该脚本从 NCBI 核苷酸数据库下载基因组并将其保存在 FASTA 文件中。
>>> from Bio import Entrez
>>> from Bio import SeqIO
>>> output_file = open("all_records.fasta", "w")
>>> Entrez.email = "my_email@example.com"
>>> records_to_download = ["FO834906.1", "FO203501.1"]
>>> for record_id in records_to_download:
...     handle = Entrez.efetch(db="nucleotide", id=record_id, rettype="gb")
...     seqRecord = SeqIO.read(handle, format="gb")
...     handle.close()
...     output_file.write(seqRecord.format("fasta"))
```

<image>

<image>

Bio.Phylo模块提供了用于处理和可视化系统发生树的工具，且支持多种文件格式的读写，包括Newick、Nexus和phyloXML。通过`Tree`和`Clade`对象支持常见的树操作和遍历。示例包括转换和整理树文件、从树中提取子集、更改树的根以及分析分支特征（例如长度或分数）。

有根树可以用ASCII或使用matplotlib绘制（见图1），且Graphviz库可用于创建无根布局（见图2）。

### 基因组图

<image>

GenomeDiagram模块为Biopython提供了可视化序列的方法。序列可以以线性或圆形形式绘制（参见图 3），并且支持许多输出格式，包括PDF和PNG。制作轨迹然后向轨迹添加序列特征可以创建图表。通过遍历序列的特征和使用其属性，可以决定是否、如何将其添加到图表的轨迹，且可以对最终图表的外观进行更多控制。可以在不同轨迹之间绘制交叉链接，从而在单个图表中比较多个序列。

### 高分子结构

2003年时Bio.PDB模块被添加到Biopython，它可以从PDB和mmCIF文件加载分子结构，`Structure`对象是该模块的核心，它以分层方式组织大分子结构：`Structure`对象包含`Model`对象，Model对象包含`Chain`对象，Chain对象包含`Residue`对象，Residue对象包含`Atom`对象。无序残基和原子有自己的类， `DisorderedResidue`和`DisorderedAtom`，描述它们的不确定位置。

使用Bio.PDB可以浏览大分子结构文件的各个组成部分，例如检查蛋白质中的每个原子。可以进行常见的分析，例如测量距离或角度、比较残留物以及计算残留物深度。

### 群体遗传学

Bio.PopGen模块增加了对Biopython for Genepop的支持，Genepop是一个用于群体遗传学统计分析的软件包。这允许分析哈迪-温伯格平衡、连锁不平衡和群体等位基因频率的其他特征。

该模块还可以使用fastsimcoal2程序，利用凝聚态理论进行群体遗传模拟。

### 命令行工具的包装

Biopython的许多模块都包含常用工具的命令行包装器，允许在Biopython中使用这些工具。这些包装器包括BLAST、Clustal、PhyML、EMBOSS和SAMtools。用户可以将通用封装类子类化，以添加对其他命令行工具的支持。

## 基本资料

- 作者：Chapman B, Chang J
- 发行日期：2002年12月17日
- 编程语言：Python和C语言
- 平台：跨平台
- 类型：生物信息学
- 许可协议： Biopython许可证
- 源代码库：https://github.com/biopython/biopython.github.io