Biopython: Pythonにおける計算分子生物学
概要
Biopython は、生物学的情報処理のための、無料で利用可能な Python ツールの包括的なセットです。配列操作、ファイル I/O、データベースアクセス、構造バイオインフォマティクス、系統解析、およびその他多くのバイオインフォマティクスタスクのための機能を提供します。現在のバージョンは Biopython 1.87 (2026年3月30日リリース) です。Python 3.10-3.14 および PyPy3.10 をサポートし、NumPy が必要です。Biopython 1.87 は、信頼できないファイルをパースする際の Bio.Entrez.Parser における CVE-2025-68463 にも対応しているため、外部提供の Entrez XML をパースするワークフローでは 1.87 以降を推奨します。
このスキルを使用するタイミング
以下の場合にこのスキルを使用します:
- 生物学的配列(DNA、RNA、またはタンパク質)を扱う場合
- 生物学的ファイル形式(FASTA、GenBank、FASTQ、PDB、mmCIF など)の読み取り、書き込み、または変換を行う場合
- Entrez を介して NCBI データベース(GenBank、PubMed、Protein、Gene など)にアクセスする場合
- BLAST 検索を実行するか、BLAST 結果を解析する場合
- 配列アラインメント(ペアワイズまたはマルチプル配列アラインメント)を実行する場合
- PDB ファイルからタンパク質構造を解析する場合
- 系統樹を作成、操作、または可視化する場合
- 配列モチーフを見つけるか、モチーフパターンを解析する場合
- 配列統計(GC含量、分子量、融解温度など)を計算する場合
- 構造バイオインフォマティクスタスクを実行する場合
- 集団遺伝学データを扱う場合
- その他の計算分子生物学タスク
コア機能
Biopython はモジュール式のサブパッケージに編成されており、それぞれが特定のバイオインフォマティクス領域を扱います:
- 配列処理 - Bio.Seq と Bio.SeqIO による配列操作とファイル I/O
- アラインメント解析 - Bio.Align と Bio.AlignIO によるペアワイズおよびマルチプル配列アラインメント
- データベースアクセス - Bio.Entrez による NCBI データベースへのプログラム的アクセス
- BLAST 操作 - Bio.Blast による BLAST 検索の実行と解析
- 構造バイオインフォマティクス - Bio.PDB による 3D タンパク質構造の操作
- 系統解析 - Bio.Phylo による系統樹の操作と可視化
- 高度な機能 - モチーフ、集団遺伝学、配列ユーティリティなど
インストールとセットアップ
再現性のためにバージョンを明示的に指定して、現在の安定版 Biopython リリースをインストールします:
uv pip install "biopython==1.87"
NCBI データベースにアクセスする場合は、必ずメールアドレスを設定してください(NCBI 必須)。再利用可能なソフトウェアの場合は、安定した Entrez.tool 値を設定し、ツールとメールを NCBI に登録します。より高いレート制限(3 req/s の代わりに 10 req/s)を得るには、NCBI_API_KEY のみを環境から読み取ります。キーをハードコードしたり、無関係な環境変数をロードしたりしないでください:
import os
from Bio import Entrez
Entrez.email = "[email protected]" # 必須 — 実際のメールを使用してください
Entrez.tool = "your_tool_name" # オプションですが、再利用可能なソフトウェアには推奨
# オプション: https://www.ncbi.nlm.nih.gov/account/settings/ に登録
if api_key := os.environ.get("NCBI_API_KEY"):
Entrez.api_key = api_key
このスキルの使用方法
このスキルは、機能領域ごとに編成された包括的なドキュメンテーションを提供します。タスクに取り組む際は、関連するリファレンスドキュメンテーションを参照してください:
1. 配列処理 (Bio.Seq & Bio.SeqIO)
リファレンス: references/sequence_io.md
以下の場合に使用:
- 生物学的配列の作成と操作
- 配列ファイルの読み取りと書き込み(FASTA、GenBank、FASTQ など)
- ファイル形式間の変換
- 大きなファイルからの配列抽出
- 配列の翻訳、転写、および逆相補配列の取得
- SeqRecord オブジェクトの操作
簡単な例:
from Bio import SeqIO
# FASTA ファイルから配列を読み取る
for record in SeqIO.parse("sequences.fasta", "fasta"):
print(f"{record.id}: {len(record.seq)} bp")
# GenBank を FASTA に変換
SeqIO.convert("input.gb", "genbank", "output.fasta", "fasta")
2. アラインメント解析 (Bio.Align & Bio.AlignIO)
リファレンス: references/alignment.md
以下の場合に使用:
- ペアワイズ配列アラインメント(グローバルおよびローカル)
- マルチプル配列アラインメントの読み取りと書き込み
- 置換行列(BLOSUM、PAM)の使用
- アラインメント統計の計算
- アラインメントパラメータのカスタマイズ
簡単な例:
from Bio import Align
# ペアワイズアラインメント
aligner = Align.PairwiseAligner()
aligner.mode = 'global'
alignments = aligner.align("ACCGGT", "ACGGT")
print(alignments[0])
3. データベースアクセス (Bio.Entrez)
リファレンス: references/databases.md
以下の場合に使用:
- NCBI データベースの検索(PubMed、GenBank、Protein、Gene など)
- 配列とレコードのダウンロード
- 出版情報の取得
- データベース間での関連レコードの検索
- 適切なレート制限を用いたバッチダウンロード
簡単な例:
from Bio import Entrez
Entrez.email = "[email protected]"
# PubMed を検索
handle = Entrez.esearch(db="pubmed", term="biopython", retmax=10)
results = Entrez.read(handle)
handle.close()
print(f"Found {results['Count']} results")
4. BLAST 操作 (Bio.Blast)
リファレンス: references/blast.md
以下の場合に使用:
- NCBI Web サービスを介した BLAST 検索の実行
- ローカル BLAST 検索の実行
- BLAST XML 出力の解析
- E 値または同一性による結果のフィルタリング
- ヒット配列の抽出
簡単な例:
from Bio.Blast import NCBIWWW, NCBIXML
# BLAST 検索を実行
result_handle = NCBIWWW.qblast("blastn", "nt", "ATCGATCGATCG")
blast_record = NCBIXML.read(result_handle)
# トップヒットを表示
for alignment in blast_record.alignments[:5]:
print(f"{alignment.title}: E-value={alignment.hsps[0].expect}")
5. 構造バイオインフォマティクス (Bio.PDB)
リファレンス: references/structure.md
以下の場合に使用:
- PDB および mmCIF 構造ファイルの解析
- タンパク質構造階層の操作(SMCRA: Structure/Model/Chain/Residue/Atom)
- 距離、角度、二面角の計算
- 二次構造の割り当て(DSSP)
- 構造の重ね合わせと RMSD 計算
- 構造からの配列抽出
簡単な例:
from Bio.PDB import PDBParser
# 構造を解析
parser = PDBParser(QUIET=True)
structure = parser.get_structure("1crn", "1crn.pdb")
# アルファ炭素間の距離を計算
chain = structure[0]["A"]
distance = chain[10]["CA"] - chain[20]["CA"]
print(f"Distance: {distance:.2f} Å")
6. 系統解析 (Bio.Phylo)
リファレンス: references/phylogenetics.md
以下の場合に使用:
- 系統樹の読み取りと書き込み(Newick、NEXUS、phyloXML)
- 距離行列またはアラインメントからの樹の構築
- 樹の操作(剪定、根の付け替え、ラダー化)
- 系統距離の計算
- コンセンサス樹の作成
- 樹の可視化
簡単な例:
from Bio import Phylo
# 樹の読み取りと可視化
tree = Phylo.read("tree.nwk", "newick")
Phylo.draw_ascii(tree)
# 距離の計算
distance = tree.distance("Species_A", "Species_B")
print(f"Distance: {distance:.3f}")
7. 高度な機能
リファレンス: references/advanced.md
以下の場合に使用:
- 配列モチーフ (Bio.motifs) - モチーフパターンの発見と解析
- 集団遺伝学 (Bio.PopGen) - GenePop ファイル、Fst 計算、Hardy-Weinberg 検定
- 配列ユーティリティ (Bio.SeqUtils) - GC含量、融解温度、分子量、タンパク質解析
- 制限酵素解析 (Bio.Restriction) - 制限酵素サイトの発見
- クラスタリング (Bio.Cluster) - K-means および階層的クラスタリング
- ゲノムダイアグラム (GenomeDiagram) - ゲノム特徴の可視化
簡単な例:
from Bio.SeqUtils import gc_fraction, molecular_weight
from Bio.Seq import Seq
seq = Seq("ATCGATCGATCG")
print(f"GC content: {gc_fraction(seq):.2%}")
print(f"Molecular weight: {molecular_weight(seq, seq_type='DNA'):.2f} g/mol")
一般的なワークフローガイドライン
ドキュメンテーションの読み方
ユーザーが特定の Biopython タスクについて質問した場合:
- タスクの説明に基づいて適切なモジュールを特定します
- Read ツールを使用して適切なリファレンスファイルを読み取ります
- 関連するコードパターンを抽出し、ユーザーの特定のニーズに適合させます
- タスクに必要な場合は複数のモジュールを組み合わせます
リファレンスファイルの検索パターンの例:
# 特定の関数に関する情報を見つける
rg -n "SeqIO.parse" references/sequence_io.md
# 特定のタスクの例を見つける
rg -n "BLAST" references/blast.md
# 特定の概念に関する情報を見つける
rg -n "alignment" references/alignment.md
Biopython コードの記述
Biopython コードを記述する際は、以下の原則に従ってください:
-
モジュールを明示的にインポートする
from Bio import SeqIO, Entrez from Bio.Seq import Seq -
NCBI データベースを使用する場合は Entrez メールを設定し、存在する場合は環境から
NCBI_API_KEYのみをロードするimport os from Bio import Entrez Entrez.email = "[email protected]" Entrez.tool = "your_tool_name" if api_key := os.environ.get("NCBI_API_KEY"): Entrez.api_key = api_key -
適切なファイル形式を使用する - タスクに最も適した形式を確認する
# 一般的な形式: "fasta", "genbank", "fastq", "clustal", "phylip" -
ファイルを適切に処理する - 使用後はハンドルを閉じるか、コンテキストマネージャーを使用する
with open("file.fasta") as handle: records = SeqIO.parse(handle, "fasta") -
大きなファイルにはイテレータを使用する - すべてをメモリにロードしない
for record in SeqIO.parse("large_file.fasta", "fasta"): # 一度に1レコードずつ処理 -
エラーを適切に処理する - ネットワーク操作やファイル解析は失敗する可能性がある
from urllib.error import HTTPError try: handle = Entrez.efetch(db="nucleotide", id=accession) except HTTPError as e: print(f"Error: {e}")
一般的なパターン
パターン 1: GenBank から配列を取得
from Bio import Entrez, SeqIO
Entrez.email = "[email protected]"
# 配列を取得
handle = Entrez.efetch(db="nucleotide", id="EU490707", rettype="gb", retmode="text")
record = SeqIO.read(handle, "genbank")
handle.close()
print(f"Description: {record.description}")
print(f"Sequence length: {len(record.seq)}")
パターン 2: 配列解析パイプライン
from Bio import SeqIO
from Bio.SeqUtils import gc_fraction
for record in SeqIO.parse("sequences.fasta", "fasta"):
# 統計量を計算
gc = gc_fraction(record.seq)
length = len(record.seq)
# ORF を見つけ、翻訳などを行う
protein = record.seq.translate()
print(f"{record.id}: {length} bp, GC={gc:.2%}")
パターン 3: BLAST とトップヒットの取得
from Bio.Blast import NCBIWWW, NCBIXML
from Bio import Entrez, SeqIO
Entrez.email = "[email protected]"
# BLAST を実行
result_handle = NCBIWWW.qblast("blastn", "nt", sequence)
blast_record = NCBIXML.read(result_handle)
# トップヒットのアクセッション番号を取得
accessions = [aln.accession for aln in blast_record.alignments[:5]]
# 配列を取得
for acc in accessions:
handle = Entrez.efetch(db="nucleotide", id=acc, rettype="fasta", retmode="text")
record = SeqIO.read(handle, "fasta")
handle.close()
print(f">{record.description}")
パターン 4: 配列から系統樹を構築
from Bio import AlignIO, Phylo
from Bio.Phylo.TreeConstruction import DistanceCalculator, DistanceTreeConstructor
# アラインメントを読み取る
alignment = AlignIO.read("alignment.fasta", "fasta")
# 距離を計算
calculator = DistanceCalculator("identity")
dm = calculator.get_distance(alignment)
# 樹を構築
constructor = DistanceTreeConstructor()
tree = constructor.nj(dm)
# 可視化
Phylo.draw_ascii(tree)
ベストプラクティス
- コードを書く前に関連するリファレンスドキュメンテーションを常に読む
- grep を使用してリファレンスファイル内の特定の関数や例を検索する
- 解析前にファイル形式を検証する
- 欠損データを適切に処理する - すべてのレコードがすべてのフィールドを持つわけではない
- ダウンロードしたデータをキャッシュする - 同じ配列を繰り返しダウンロードしない
- NCBI のレート制限を尊重する - 再利用可能なソフトウェアには API キー、登録済みのツール/メール値、大規模ジョブには Entrez の履歴/バッチ処理機能を使用する
- 大きなファイルを処理する前に小さなデータセットでテストする
- Biopython を最新バージョンに保つ - 最新機能とバグ修正を利用するため
- 翻訳には適切な遺伝コードテーブルを使用する
- 再現性のために解析パラメータを文書化する
一般的な問題のトラブルシューティング
問題: "No handlers could be found for logger 'Bio.Entrez'"
解決策: これは単なる警告です。Entrez.email を設定して抑制します。
問題: NCBI からの "HTTP Error 400"
解決策: ID/アクセッション番号が有効で、適切にフォーマットされていることを確認します。
問題: ファイル解析時の "ValueError: EOF"
解決策: ファイル形式が指定された形式文字列と一致していることを確認します。
問題: アラインメントが "sequences are not the same length" で失敗する
解決策: AlignIO または MultipleSeqAlignment を使用する前に、配列がアラインメント済みであることを確認します。
問題: BLAST 検索が遅い
解決策: 大規模な検索にはローカル BLAST を使用するか、結果をキャッシュします。
問題: PDB パーサーの警告
解決策: PDBParser(QUIET=True) を使用して警告を抑制するか、構造の品質を調査します。
問題: Bio.HMM、Bio.MarkovModel、または Bio.Application の ImportError
解決策: これらのモジュールは Biopython 1.86 で削除されました。HMM には hmmlearn を、Bio.Application CLI ラッパーの代わりには標準ライブラリの subprocess モジュールを使用してください。
問題: 1.86 以降にアップグレード後、PairwiseAligner が返すアラインメント数が減少した
解決策: デフォルトのギャップスコアが 1.86 で 0 から -1 に変更され、自明なタイアラインメントが排除されました。必要に応じて aligner.gap_score = 0 を設定して古い動作を復元します(references/alignment.md を参照)。
追加リソース
- 公式ドキュメンテーション: https://biopython.org/docs/latest/
- チュートリアル: https://biopython.org/docs/latest/Tutorial/
- クックブック: https://biopython.org/docs/latest/Tutorial/ (高度な例)
- GitHub: https://github.com/biopython/biopython
- リリースノート: バージョン間の変更点については、https://github.com/biopython/biopython/releases を参照
- メーリングリスト: https://biopython.org/wiki/Mailing_list
- 問題トラッカー: https://github.com/biopython/biopython/issues