A comprehensive toolbox for computational molecular biology; use it when you need programmatic sequence/structure parsing, batch bioinformatics pipelines, or automated NCBI/BLAST workflows.
64
77%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./scientific-skills/Data Analysis/biopython/SKILL.mdUse this skill when you need to:
Bio.Entrez, respecting rate limits.Note: For quick one-off queries, tools like gget may be more convenient; for multi-service API aggregation, bioservices may be a better fit.
Bio.Seq, Bio.SeqRecord, Bio.SeqUtils (GC fraction, molecular weight, translation, etc.).Bio.SeqIO, Bio.AlignIO for FASTA/FASTQ/GenBank and alignment formats.Bio.Entrez for esearch, efetch, elink, and structured parsing via Entrez.read.Bio.Blast.NCBIWWW for remote BLAST and Bio.Blast.NCBIXML for XML parsing.Bio.PDB for PDB/mmCIF parsing, hierarchy traversal, and geometry calculations.Bio.Phylo and Bio.Phylo.TreeConstruction for tree I/O, distances, and construction.Reference guides (if present in this repository) can be consulted for deeper module-specific patterns:
references/sequence_io.mdreferences/alignment.mdreferences/databases.mdreferences/blast.mdreferences/structure.mdreferences/phylogenetics.mdreferences/advanced.mdbiopython==1.85numpy>=1.20 (required by Biopython)Install:
python -m pip install "biopython==1.85" "numpy>=1.20"A complete, runnable example that:
Create example_biopython_pipeline.py:
from __future__ import annotations
import os
import time
from typing import Optional
from Bio import Entrez, SeqIO
from Bio.SeqUtils import gc_fraction
# Optional BLAST (remote). Comment out if you do not want network calls.
from Bio.Blast import NCBIWWW, NCBIXML
def configure_entrez() -> None:
"""
NCBI requires an email. An API key increases rate limits.
Set these via environment variables to avoid hardcoding secrets.
"""
email = os.environ.get("NCBI_EMAIL")
if not email:
raise RuntimeError("Set NCBI_EMAIL env var (required by NCBI). Example: export NCBI_EMAIL='you@org.org'")
Entrez.email = email
api_key = os.environ.get("NCBI_API_KEY")
if api_key:
Entrez.api_key = api_key
def read_first_fasta_record(path: str):
with open(path, "r", encoding="utf-8") as handle:
return next(SeqIO.parse(handle, "fasta"))
def blast_top_accession(sequence: str, program: str = "blastn", database: str = "nt") -> Optional[str]:
"""
Remote BLAST can be slow and rate-limited. For large-scale BLAST, prefer local BLAST+.
"""
result_handle = NCBIWWW.qblast(program, database, sequence)
blast_record = NCBIXML.read(result_handle)
if not blast_record.alignments:
return None
# Many BLAST titles include multiple identifiers; accession is usually available directly.
return blast_record.alignments[0].accession
def fetch_fasta_by_accession(accession: str) -> str:
with Entrez.efetch(db="nucleotide", id=accession, rettype="fasta", retmode="text") as handle:
return handle.read()
def main() -> None:
configure_entrez()
record = read_first_fasta_record("input.fasta")
seq = record.seq
print(f"ID: {record.id}")
print(f"Length: {len(seq)}")
print(f"GC fraction: {gc_fraction(seq):.2%}")
# Be polite to NCBI services in batch workflows.
time.sleep(0.34)
top_acc = blast_top_accession(str(seq))
if not top_acc:
print("No BLAST hits found.")
return
print(f"Top BLAST accession: {top_acc}")
time.sleep(0.34)
fasta_text = fetch_fasta_by_accession(top_acc)
print("Top hit FASTA:")
print(fasta_text)
if __name__ == "__main__":
main()Run:
export NCBI_EMAIL="your.email@example.com"
# export NCBI_API_KEY="your_ncbi_api_key" # optional
python example_biopython_pipeline.pyProvide an input.fasta in the same directory, e.g.:
>demo
ATCGATCGATCGATCGATCGSeqIO.parse) to avoid loading entire files into memory. Use SeqIO.read only when exactly one record is expected.Entrez.email (NCBI requirement).Entrez.api_key to increase request limits.time.sleep(0.34) as a conservative baseline) and implement retries for transient HTTP failures.NCBIWWW.qblast(...) is convenient but can be slow and is not ideal for high-throughput workloads.NCBIXML.read(...) (single record) or NCBIXML.parse(...) (multiple records).alignment.hsps.Bio.SeqUtils.gc_fraction(seq) for GC fraction (returns 0–1).seq.translate(table=...) with the correct genetic code table for reproducibility.Bio.PDB.PDBParser(QUIET=True) to suppress warnings when appropriate.f5ef65b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.