我的Python筆記·BioPython(一)

2021-03-02 生信菜鳥團

簡介

Biopython(https://biopython.org/)是一個計算分子生物學模塊的集合,用它可以實現許多生物信息學項目中的基本任務,比如:

解析文件格式,這些信息包括如基因和蛋白質序列、蛋白質結構、PubMed記錄等等;

從資源庫下載文件,這些資源包括NCBI,ExPASy等;

運行(本地或遠程)常用的生物信息學算法,如BLAST,ClustalW等;

運行Biopython實現的算法,進行聚類、機器學習、數據分析和可視化。

我們也不僅可以用Biopython建立一個研究流程,也可以為特定的任務寫新的代碼,而讓Biopython進行更多標準操作,你還可以修改Biopython的開原始碼以更好地適應你的需求。

讓我們開始吧安裝Biopython

直接使用pip安裝:

pip install biopython

升級舊版本:

pip install biopython --upgrade

一個簡單的示例

在前面的筆記中我們已經學習了如何用基本的字符串操作來解析序列文件,現在讓我們用Biopython來試試看。Biopython提供了快速處理序列文件的工具,使利用不同文件格式、注釋序列記錄和把他們寫入文件等操作變得非常簡單。下面實例我們會用到4個從Bio導入的模塊:Seq用來創建序列對象;IUPAC用來定義一個序列對象用的字符集(如DNA或蛋白質);SeqRecord允許創建一個包含ID、注釋、描述等的序列記錄數據;SeqIO用來讀寫格式化的序列文件。

from Bio import Seq
from Bio.Alphabet import IUPAC
from Bio.SeqRecord import SeqRecord
from Bio import SeqIO

dna = open("hemoglobin-gene.txt").read().strip()
dna = Seq.Seq(dna, IUPAC.unambiguous_dna)

mrna = dna.transcribe()
protein = mrna.translate()


protein_record = SeqRecord(protein, id='sp|P69905.2|HBA_HUMAN', description="Hemoglobin subunit alpha, human")
outfile = open("HBA_HUMAN.fasta", "w")
SeqIO.write(protein_record, outfile, "fasta")
outfile.close()

hemoglobin-gene.txt文件內容如下:

ATGGTGCTGTCTCCTGCCGACAAGACCAACGTCAAGGCCGCCTGGGGTAAGGTCGGCGCGCACGCTGGCGAGTATGGTGCGGAGGCCCTGGAGAGGATGTTCCTGTCCTTCCCCACCACCAAGACCTACTTCCCGCACTTCGACCTGAGCCACGGCTCTGCCCAGGTTAAGGGCCACGGCAAGAAGGTGGCCGACGCGCTGACCAACGCCGTGGCGCACGTGGACGACATGCCCAACGCGCTGTCCGCCCTGAGCGACCTGCACGCGCACAAGCTTCGGGTGGACCCGGTCAACTTCAAGCTCCTAAGCCACTGCCTGCTGGTGACCCTGGCCGCCCACCTCCCCGCCGAGTTCACCCCTGCGGTGCACGCCTCCCTGGACAAGTTCCTGGCTTCTGTGAGCACCGTGCTGACCTCCAAATACCGTTAA

HBA_HUMAN.fasta輸出文件如下:

>sp|P69905.2|HBA_HUMAN Hemoglobin subunit alpha, human
MVLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHG
KKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTP
AVHASLDKFLASVSTVLTSKYR*

程序是如何工作的

程序首先從文本文件中讀取序列,然後將它轉錄成mRNA序列,翻譯成肽段序列,最後寫入HBA_HUMAN.fasta輸出文件。讓我們逐步分析導入Python會話3中的對象們。

Seq對象

Seq.Seq類創建了一個序列對象,用戶在創建Seq對象時可以指定(或不指定)其字符集。

>>> from Bio.Seq import Seq
>>> my_seq = Seq("AGTACACTGGT")
>>> my_seq
Seq('AGTACACTGGT', Alphabet())
>>> my_seq.alphabet
Alphabet()

當我們指定字符集時:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq("AGTACACTGGT", IUPAC.unambiguous_dna)
>>> my_seq
Seq('AGTACACTGGT', IUPACUnambiguousDNA())
>>> my_seq.alphabet
IUPACUnambiguousDNA()

當然,這也許是個胺基酸序列:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import IUPAC
>>> my_seq = Seq("AGTACACTGGT", IUPAC.unambiguous_dna)
>>> my_seq
Seq('AGTACACTGGT', IUPACUnambiguousDNA())
>>> my_seq.alphabet
IUPACUnambiguousDNA()

Biopython包含了一個預編譯好的字符集,覆蓋了所有生物序列類型。最頻繁使用的是IUPAC定義的字符集(http://www. chem. qmw. ac. uk/iupac)。如果用戶需要使用字符集,就必須從Bio. Alphabet模塊導入IUPAC模塊。它包括字符集IUPACUnamiguousDNA(基本的ACTG字母),IUPACAmbiguousDNA(包含二義字母),ExtendedIUPACDNA(包含修飾的鹼基),IUPACUnamiguousRNA, IUPACAmbiguousRNA, ExtendedIUPACRNA,IUPACProtein(IUPAC標準胺基酸)和ExtendedIUPACProtein(包括硒代半胱氨酸,X等)。在上面的實例中定義的dna變量是一個以IUPAC.unambiguous_dna字符集為特徵的序列對象。

轉錄和翻譯序列

Seq對象可以用transcribe()方法和translate()方法來進行轉錄和翻譯。transcribe()方法只是把所有的T替換成U,同時把字符集設置成RNA。我們也可以用reverse_complement()方法來得到反向互補序列,如:

>>> from Bio import Seq
>>> my_seq = Seq.Seq("AGTACACTGGT")
>>> cdna = my_seq.reverse_complement()
>>> cdna
Seq('ACCAGTGTACT', Alphabet())

把序列當成字符串工作

在Biopython中,我們可以像處理字符串一樣處理序列對象。例如,可以索引、切片、分割、轉換序列大小寫,計算出現字符個數等等:

>>> from Bio import Seq
>>> my_seq = Seq.Seq("AGTACACTGGT")
>>> my_seq[0]
'A'
>>> my_seq[0:3]
Seq('AGT', Alphabet())
>>> my_seq.split('T')
[Seq('AG', Alphabet()), Seq('ACAC', Alphabet()), Seq('GG', Alphabet()), Seq('', Alphabet())]
>>> my_seq.count('A')
3
>>> my_seq.count('A')/len(my_seq)
0.2727272727272727

需要注意的是將Seq對象分割後返回的是多個Seq對象,這些Seq對象可以用+連接。

除此之外,我們還可以用find()方法搜索序列中的子串,如果沒有找到會返回-1,找到了則返回目標序列的最左端匹配字符的位置。當然,也可以配合Python的re模塊或Biopython的Bio.motif模塊用正則表達式進行搜索。

SeqRecord對象

SeqRecord類提供序列及其注釋的容器,在上面的實例中我們將翻譯得到的protein變量轉換成SeqRecord對象。

protein_record = SeqRecord(protein, id='sp|P69905.2|HBA_HUMAN', description="Hemoglobin subunit alpha, human")

SeqRecord 類包括下列屬性:

.seq

– 序列自身(即 Seq 對象)。

.id

– 序列ID。通常類同於accession number。

.name

– 序列名/id 。可以是accession number, 也可是clone名(類似GenBank record中的LOCUS id)。

.description

– 序列描述。

.letter_annotations

– 對照序列的每個字母逐字注釋(per-letter-annotations),以信息名為鍵(keys),信息內容為值(value)所構成的字典。值與序列等長,用Python列表、元組或字符串表示。.letter_annotations可用於質量分數或二級結構信息 (如 Stockholm/PFAM 比對文件)等數據的存儲。

.annotations

– 用於儲存附加信息的字典。信息名為鍵(keys),信息內容為值(value)。用於保存序列的零散信息(如unstructured information)。

.features

– SeqFeature 對象列表,儲存序列的結構化信息(structured information),如:基因位置, 蛋白結構域。

.dbxrefs

– 儲存資料庫交叉引用信息(cross-references)的字符串列表。

SeqIO模塊

Biopython的SeqIO模塊提供了多種常用文件格式的解析器。這些解析器從一個輸入文件(從本地或資料庫中)提取信息,而後自動轉換成SeqRecord對象。SeqIO模塊也提供了一種方法把SeqRecord對象寫入到格式化的文件中。

解析文件

序列文件的解析有兩種方式:SeqIO.parse()和SeqIO.read():這兩種方法都有兩個必須的參數和一個可選參數:

輸入文件,它指定從哪裡讀取數據;

數據格式,如fasta或genbank,完整的支持格式列表參見:http:// biopython.org/wiki/SeqIO

參數指定序列數據的字符集(可選)。

SeqIO.parse()和SeqIO.read()的區別在於:SeqIO.parse()返回的是一個迭代器,即從輸入文件中產生幾個SeqRecord對象,你可以用for或while循環來遍歷他們;而當文件中只包含一條記錄時,就像上面的例子,則必須用SeqIO.read()。換言之,SeqIO.parse()能處理輸入文件中任意數目的記錄,而SeqIO.read()只能處理一條記錄的文件,後者會先檢查文件中是否只有一條記錄,否則將會產生錯誤。

解析大文件

對於大量記錄,可以使用SeqIO.index()方法,它需要兩個參數:記錄文件和文件格式。SeqIO.index()方法返回一個字典式對象,用它可以訪問所有記錄而不用把他們都讀取到內存中。字典的鍵是記錄的ID,值包含整個記錄,後者也能用屬性來訪問,如id,description等。需要注意的是,這些類字典對象是只讀的,也就是說創建後不能刪除或插入。

寫文件

SeqIO.write()方法可將一個或多個SeqRecord對象寫入指定格式的文件中。用這個方法需要三個參數:一個或多個SeqRecord對象,輸出文件以及輸出的格式。

示例用SeqIO模塊來解析一個多序列FASTA文件

代碼會輸出這些序列的標識、序列和長度。

from Bio import SeqIO
fasta_file = open("Uniprot.fasta","r")
for seq_record in SeqIO.parse(fasta_file, "fasta"):
    print(seq_record.id) 
    print(repr(seq_record.seq)) 
    print(len(seq_record)) 
fasta_file.close()

用SeqIO模塊來解析文件並將其內容儲存到列表或字典中

下面的代碼將文件解析並儲存到列表中,輸出為第一條記錄的標識和序列。

from Bio import SeqIO
uniprot_iterator = SeqIO.parse("Uniprot.fasta", "fasta")
records = list(uniprot_iterator)
print(records[0].id)
print(records[0].seq)

此外可以使用字典,鍵是記錄的ID,值包含記錄的信息:

from Bio import SeqIO
uniprot_iterator = SeqIO.parse("Uniprot.fasta", "fasta")
records = SeqIO.index("Uniprot.fasta","fasta")
print(len(records['sp|P03372|ESR1_HUMAN'].seq))

序列文件格式的轉換

可以使用SeqIO.parse()和SeqIO.write()來轉換序列格式,下面的腳本把一個Genbank文件轉換成FASTA文件:

from Bio import SeqIO
genbank_file = open ("AY810830.gb", "r")
output_file = open("AY810830.fasta", "w")
records = SeqIO.parse(genbank_file, "genbank")
SeqIO.write(records, output_file, "fasta")
output_file.close()

 

猜你喜歡

生信基礎知識100講

生信菜鳥團-專題學習目錄(5)

還有更多文章,請移步公眾號閱讀

▼ 如果你生信基本技能已經入門,需要提高自己,請關注下面的生信技能樹,看我們是如何完善生信技能,成為一個生信全棧工程師。

▼ 如果你是初學者,請關注下面的生信菜鳥團,了解生信基礎名詞,概念,紮實的打好基礎,爭取早日入門。

    


相關焦點

  • 我的 Python 編碼規範
    /usr/bin/env python# -*- coding: utf-8 -*-"""通常這裡是關於本文檔的說明(docstring),須以半角的句號、 問號或驚嘆號結尾!如果 python 源碼文件沒有聲明編碼格式,python 解釋器會默認使用 ASCII 編碼,一旦源碼文件包含非ASCII編碼的字符,python 解釋器就會報錯。以 UTF-8 為例,以下兩種編碼格式聲明都是合乎規則的。我一直 UTF-8 編碼格式,喜歡使用第一種聲明方式。Windows 平臺上,編碼格式聲明必須位於 python 文件的第一行。
  • 【Python基礎】python使用python-docx操作word
    1、python-docx庫介紹該模塊兒可以創建、修改Word(.docx)文件;python-docx使用官網:python-docx官網我們在安裝此模塊兒使用的是pip install python-docx,但是在導入的時候是import docx;2、Python讀取Word文檔內容注意:每進行一個操作,必須保存一下,否則等於白做;1)word文檔結構介紹在這裡插入圖片描述2)python-docx
  • 我是如何在六個月內學會 Python 的?
    對於一個以前在編程或計算機方面沒有經驗的人來說,學習像python這樣的一整門語言似乎是一項不可能完成的任務。但是,在同等情況下,只要你覺得自己可以,就沒有什麼是不可能的。現在,我想跟大家分享一些自己在學習2020年最受歡迎的程式語言(python)方面的tips。
  • python入門書籍,輕鬆學python
    全民學python的熱潮已經開啟,然而,對於這種情況,還是有很多小夥伴私信我python到底該怎麼入門?沒接觸過編程能學會嗎?
  • python入門
    --Yves Hilpisch 《Python for Finance》發現近期學習python的人越來越多了,最近也有人問我有沒有啥課程或者書推薦的。我自己還是側重數據計算和在金融中的應用,系統管理、web開發等沒做過。我當年也是新手入門,自己搜索嘗試,買了很多的書,也在網上下載了很多資料。
  • 學python能找到女朋友嗎(python基礎教程)
    編者按:學習python近兩年,談談我對於python的一點小理解,也從一些方面談談自己微薄的想法,本文會介紹如何學習Python。實現一個微型的HTTP服務程序來說是很簡單的事情,在Python下,只需要一個命令行,為了提高大家的編程效率,那就趕快關注本文吧!
  • 人生苦短,我用Python,那麼問題來了,普通人要學python嗎?
    最近娃他爸去幼兒教育店集中地兒瞎晃悠,震驚的發現這年頭六歲娃兒都要學編程了,當時我的表情是這樣的。   回到家抱著冷嘲熱諷的心,我特意百度搜索了下新聞,結果我的表情是這樣的:
  • 講一講我是如何通過Python實現辦公自動化的
    我們需要學習的主要內容有:python基礎;excel自動化;ppt自動化;word自動化。對於python語法的要求,你可以對照python基礎教程的部分查看需要學那些,找個免費視頻教程跟著學,然後多敲代碼練習。如果習慣看書的話,可以買本python入門書備查。
  • python基礎學習教程:Python基礎語法
    >>> '''在學習過程中有什麼不懂得可以加我的python學習交流扣扣qun,934109170群裡有不錯的學習教程、開發工具與電子書籍。與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。'''Window 上在安裝 Python 時已經安裝了交互式編程客戶端,提示窗口如下:
  • 介紹一下什麼是python(瘋狂Python)
    後續我會不斷努力的更新關於學英語的一些文章,同時,我也會不斷更新新的知識(譬如:程式語言:python,資料庫:mysql,Linux系統的一些操作等等,與大家一起學習進步)。進入正題,大家都應該聽說過Python這門程式語言吧,它在程式語言中的排名不斷的再提升,之所以這麼受歡迎,是因為它簡單,易學。
  • 【Python雜貨鋪】速學python基礎
    「人生苦短,我學python」是編程屆的名言。用python寫小腳本的便捷性,讓很多其他語言的學習者把python當作輔助語言。擁有了某一個語言的功底,再來學習另外一種語言應該是十分快速的。編程理念都十分相似,只是看看語言的差異性。帶著Java的基礎,學習Python,準備上路了。
  • Python零基礎入門-03-Python基礎語法
    1,python系列課程學習方法由於python屬於腳本語言,如果單純的解釋語法沒有什麼實在的意義,所以我python系列的課程都是以視頻講解為主,至於這裡的文章,是給你複習用的。2. 基礎語法python的基礎語法都將以小例子作為驅動來講解。如果你有其他程式語言的基礎,那麼直接看文章就會很快上手。
  • 「繪圖,讓科學生動起來」:Python-matplotlib繪圖(專題一)python環境搭建篇
    專題一:做個行動派,安裝python及相關軟體——搭建python-matplotlib繪圖環境
  • 小白python入門基礎——Python安裝教程
    且學會python後運用python能極大地提高工作效率等等。今天就來教大家如何安裝python,走向新世界的大門!1.首先,我們在瀏覽器上搜索python,進入python官網。7.接下來我們就可以開始我們的編程之旅了!
  • python對mysql資料庫的操作(一)
    本文章介紹python對mysql資料庫的基本操作,以及編寫一個模擬用戶的註冊。
  • 科悟學院介紹什麼是Python、python能做什麼?
    這是很多人想知道的,今天小編就給你揭秘一個行業——Python(AI人工智慧),有人會問python到底是什麼?能做什麼?下面科悟學院介紹什麼是python和python能做什麼,希望對於正在學習的你有所幫助。
  • 11-python中的元組
    點擊藍色「潭時錄」關注我丫
  • python入門——注釋的妙用
    堅持每天更新,幫助入門python小夥伴們,夜深了,給大家講一講python注釋的吧。大家如果學習過c語言,就會知道程序的注釋有什麼用。這裡多提一句吧,C語言的注釋分兩種,單行注釋和多行注釋。C語言的單行注釋是最常用的是//,多行注釋最常用的是/* */好了,言歸正傳我們繼續來學習python吧,python常用單行注釋是#,常用多行注釋是三對單引號''' '''全理論太抽象,我們一起來看一看例子吧~~~一、單行注釋單行注釋第一個printprint 'woaipython','hello,world'
  • Python開發:Win10創建定時任務執行Python腳本
    日常開發過程中,可能需要再特定時間段執行我們編寫的Python腳本,如果手動輸入執行執行,會產生頻繁的工作量,對於這種情況,在Win10環境下創建任務計劃程序:  Win10創建定時任務  電腦桌面→我的電腦
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    檢查python環境上面可以看出python版本是3.7。調用exit()函數可以退出python。如果對Python安裝有疑問的可以參考我的文章:手把手教你搭建Python3開發環境手把手教你安裝python編輯器pycharm2、檢查pip3是否安裝