Biopython Bio
Bioinformatics operations using Biopython.
When to Use
- Reading/writing sequence files (FASTA, GenBank)
- Running BLAST searches (local or remote NCBI)
- Sequence alignment and manipulation
- Parsing PDB protein structures
- Phylogenetic tree construction
- Querying NCBI Entrez databases
When NOT to Use
- Clinical genomics or variant calling (use GATK, bcftools)
- RNA-seq differential expression (use DESeq2, edgeR)
- Genome assembly (use SPAdes, Canu)
- Molecular dynamics simulations (use GROMACS, OpenMM)
Sequence Reading and Writing
pythonfrom Bio import SeqIO from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord for record in SeqIO.parse('sequences.fasta', 'fasta'): print(f"{record.id}: {len(record.seq)} bp") # Write FASTA records = [SeqRecord(Seq('ATGCGATCGATCG'), id='seq1', description='example')] SeqIO.write(records, 'output.fasta', 'fasta')
Sequence Manipulation
pythonfrom Bio.Seq import Seq from Bio.SeqUtils import gc_fraction, molecular_weight dna = Seq('ATGCGATCGATCGATCG') rev_comp = dna.reverse_complement() protein = dna.translate() gc = gc_fraction(dna) mw = molecular_weight(dna, seq_type='DNA')
BLAST Searches
pythonfrom Bio.Blast import NCBIWWW, NCBIXML result_handle = NCBIWWW.qblast('blastn', 'nt', 'ATGCGATCGATCGATCG') for record in NCBIXML.parse(result_handle): for aln in record.alignments: for hsp in aln.hsps: if hsp.expect < 1e-10: print(f"{aln.title[:60]}, E={hsp.expect}")
Pairwise Alignment
pythonfrom Bio import Align aligner = Align.PairwiseAligner() aligner.mode = 'global' aligner.match_score = 2 aligner.mismatch_score = -1 best = aligner.align('ATCGATCGATCG', 'ATCAATCAATCG')[0] print(best, f"Score: {best.score}")
PDB Structure Parsing
pythonfrom Bio.PDB import PDBParser, PDBList structure = PDBParser(QUIET=True).get_structure('prot', 'structure.pdb') for chain in structure[0]: for res in chain: if res.id[0] == ' ' and 'CA' in res: print(f"{res.resname} {res.id[1]}: {res['CA'].coord}")
Entrez Queries and Phylogenetics
pythonfrom Bio import Entrez, Phylo, AlignIO from Bio.Phylo.TreeConstruction import DistanceCalculator, DistanceTreeConstructor Entrez.email = 'your.email@example.com' # Required by NCBI handle = Entrez.esearch(db='pubmed', term='CRISPR AND 2025[pdat]', retmax=5) record = Entrez.read(handle) # Phylogenetics from alignment aln = AlignIO.read('aligned.fasta', 'fasta') tree = DistanceTreeConstructor().nj(DistanceCalculator('identity').get_distance(aln)) Phylo.draw_ascii(tree)
Quick One-liner
bashpython3 -c " from Bio.Seq import Seq dna = Seq('ATGAAAGCTTGA') print(f'Protein: {dna.translate()}, RevComp: {dna.reverse_complement()}') "
Best Practices
- Always set
Entrez.emailbefore NCBI queries. - Respect NCBI rate limits: max 3 requests/second without API key.
- Use
QUIET=Truein PDB parser to suppress warnings. - Check sequence type before operations like
translate(). - For large BLAST jobs, prefer local BLAST+ over remote NCBI.


