上一篇文章生物信息中的Python 01 | 從零開始處理基因序列自己造輪子實現了序列的基礎操作,但是在Python的世界里,一項工作只要重復的次數多了,那么一定就會有大神來開發相應的包來解決,這個包名就是 Biopython 。接下來我們試著使用它來實現簡單的序列處理。
一、準備工作
1、 按照上一篇下載fasta文件的步驟,可以同理得到GeneBank的數據格式
2、現在我們的目錄結構是這樣的
3、安裝Biopython,這里有兩種方案:
3.1 用pip安裝Biopython,在cmd命令窗口輸入
- 下載Python的包管理工具:pip
-
下載完,解壓,進入解壓目錄
- Linux 下輸入
sudo python setup.py install
windows 下,在下載目錄,
Shift
+右鍵-
如下圖所示,點擊在此處打開命令窗口
mark 輸入如下命令
python setup.py install
mark -
測試是否安裝成功,出現下圖所示的提示即表示安裝成功
pip -v
mark 進入 Pycharm 的Terminal 窗口,輸入以下命令來安裝 Biopython
pip install biopython
3.2 直接用安裝包安裝
-
window系統:
- 下載地址:http://biopython.org/DIST/biopython-1.72.tar.gz
- 解壓
- 按住
shift
并點擊右鍵 - 在菜單欄點擊在此處打開命令窗口,并輸入如下命令:
pyhton stepy.py install
-
Linux系統:
打開終端 (快捷鍵:
Ctrl+Alt+T
)-
在終端輸入以下命令
$ wget http://biopython.org/DIST/biopython-1.72.tar.gz $ tar -zxvf biopython-1.72.tar.gz $ cd biopython-1.72/ $ sudo python setup.py install
-
測試是否安裝成功
$ python >>> from Bio.Seq import Seq >>> seq = Seq('ATCG') >>> seq Seq('ATCG')
二、Biopython 基礎用法
1 讀取常見的序列文件格式(fasta,gb)
from Bio import SeqIO
# 讀取包含單個序列 Fasta 格式文件
fa_seq = SeqIO.read("res/sequence1.fasta", "fasta")
# print fa_seq
# 讀取包含多個序列的 fasta 格式文件
for fa in SeqIO.parse("res/multi.fasta", "fasta"):
print (fa.seq)
# 一個多序列文件中的所有序列
seqs = [fa.seq for fa in SeqIO.parse("res/multi.fasta", "fasta")]
print (seqs)
# 如果不想要seq對象中的字母表,可以用str()來強制類型轉換
seqs = [str(fa.seq) for fa in SeqIO.parse("res/multi.fasta", "fasta")]
print (seqs)
# 讀取包含單個序列的 gb 格式文件
gb_seq = SeqIO.read("res/sequence1.gb", "genbank")
print (gb_seq)
2 瀏覽 fasta 序列文件內容
from Bio import SeqIO
# 讀取包含單個序列 Fasta 格式文件
fa_seq = SeqIO.read("res/sequence1.fasta", "fasta")
# =====獲取詳細的信息=====
# 提取基因ID,name
# Fasta 文件中序列名所在行的第一個詞被作為 id 和 name
print ("id: ", fa_seq.id)
print ("name: ", fa_seq.name)
# 基因 Description 是fasta文件格式中的第一行
print ("description: ", fa_seq.description)
# 序列
print ("seq: ", fa_seq.seq)
# 序列來源庫信息(NCBI的數據庫信息會包括數據庫交叉引用)
print ("dbxrefs: ", fa_seq.dbxrefs)
# 全部序列的注釋信息
print ("annotations: ", fa_seq.annotations)
# 序列中每個字母的注釋信息
print ("letter_annotations: ", fa_seq.letter_annotations)
# 部分序列的注釋信息
print ("features: ", fa_seq.features)
3 瀏覽 genebank 序列文件內容
from Bio import SeqIO
# 讀取包含單個序列的 gb 格式文件
gb_seq = SeqIO.read("res/sequence1.gb", "genbank")
print (gb_seq)
# =====獲取詳細的信息=====
# 提取基因ID,name
# gb文件中序列名包含比fasta更加詳細的序列信息,下面分別是 id 和 name
print ("id: ", gb_seq.id)
print ("name: ", gb_seq.name)
# 基因 Description 是fasta文件格式中的第一行
print ("description: ", gb_seq.description)
# 序列信息, 這里的序列信息是以 bioPython 中的seq對象存儲
print ("seq: ", gb_seq.seq)
# 序列來源庫信息(NCBI的數據庫信息會包括數據庫交叉引用)
print ("dbxrefs: ", gb_seq.dbxrefs)
# 全部序列的注釋信息
print ("annotations: ", gb_seq.annotations)
# 序列中每個字母的注釋信息
print ("letter_annotations: ", gb_seq.letter_annotations)
# 部分序列的注釋信息,SeqFeature 對象的形式保存了features table中的所有entries(如genes和CDS等)
print ("features: ", gb_seq.features)
# 該基因的物種信息
print ("organism: ", gb_seq.annotations["organism"])
# 關于序列的注釋信息,相關數據庫的交叉引用號
print ("comment: ", gb_seq.annotations["comment"])
# 序列來源的物種名
print ("source: ", gb_seq.annotations["source"])
# 該基因的分類學信息
print ("taxonomy: ", gb_seq.annotations["taxonomy"])
# 該基因的整理后的注釋信息
print ("structured_comment: ", gb_seq.annotations["structured_comment"])
# 該基因序列相關的關鍵詞
print ("keywords: ", gb_seq.annotations["keywords"])
# 該基因的相關文獻編號,或遞交序列的注冊信息
print ("references: ", gb_seq.annotations["references"])
# 該基因的入庫時,給的基因編號,以及在染色體上的位點信息
print ("accessions: ", gb_seq.annotations["accessions"])
# 該基因的分子類型,一般為 DNA
print ("molecule_type: ", gb_seq.annotations["molecule_type"])
# 該基因的數據文件劃分方式
print ("data_file_division: ", gb_seq.annotations["data_file_division"])
# 基因發布時間
print ("date: ", gb_seq.annotations["date"])
# 該基因的更新版本
print ("sequence_version: ", gb_seq.annotations["sequence_version"])
# 該基因的拓撲結構
print ("topology: ", gb_seq.annotations["topology"])
相信大家可以看到 GeneBank 比 fasta 格式更加詳細和貼心,但是對于序列處理來說內存占用和運行時間比這些信息更加重要。這就使fasta成為我們一般在序列分析中常用的格式。
4 新建序列文件
from Bio.Seq import Seq
# 新建一個DNA序列對象
dna_seq = Seq("GGATGGTTGTCTATTAACTTGTTCAAAAAAGTATCAGGAGTTGTCAAGGCAGAGAAGAGAGTGTTTGCA", IUPAC.unambiguous_dna)
# 新建一個RNA序列對象
rna_seq = Seq("GGATGGTTGTCTATTAACTTGTTCAAAAAAGTATCAGGAGTTGTCAAGGCAGAGAAGAGAGTGTTTGCA", IUPAC.unambiguous_rna)
# # 新建一個蛋白質序列對象
protein_seq = Seq("GGATGGTTGTCTATTAACTTGTTCAAAAAAGTATCAGGAGTTGTCAAGGCAGAGAAGAGAGTGTTTGCA", IUPAC.protein)
序列對象由一段字符串和其對應的編碼表所定義。我們可以從上述的代碼中看到,字符串內容一樣,唯一不同的就是第二個參數IUPAC值不一樣。IUPAC (International Union of Pure and Applied Chemistry ) 是一個制定化學相關標準的組織,Biopython 所使用的編碼表就是由它制定的,想了解詳細細節可以參考http://www.bioinformatics.org/sms2/iupac.html ,詳細定義如下:
名稱 | 編碼表 |
---|---|
ambiguous_dna_letters | GATCRYWSMKHBVDN |
unambiguous_dna_letters | GATC |
ambiguous_rna_letters | GAUCRYWSMKHBVDN |
unambiguous_rna_letters | GAUC |
protein | ARNDCQEGHILKMFPSTWYV |
5 修改序列文件
在生物學意義上,序列是不可以隨便更改的,也就是不可變的。如果強行修改,那么就會報錯TypeError: 'Seq' object does not support item assignment
dna_seq[0] = "G"
如果你執意修改也是可以的,但是不建議這么做
dna_seq_mutable = dna_seq.tomutable()
dna_seq_mutable[0] = "G"
6 操作序列文件
from Bio.Seq import Seq
# 新建一個DNA序列對象
dna_seq = Seq("GGATGGTTGTCTATTAACTTGTTCAAAAAAGTATCAGGAGTTGTCAAGGCAGAGAAGAGAGTGTTTGCA", IUPAC.unambiguous_dna)
# 序列信息
print ("Sequence: ", dna_seq)
# 序列長度
print ("Length : ", len(dna_seq))
# 單個核苷酸計數
print ("G Counts: ", dna_seq.count("G"))
# 獲取反向序列
print ("reverse: ", dna_seq[::-1])
# 獲取反向互補序列
print ("Reverse complement: ", dna_seq.complement())
# 獲取蛋白質的反向互補序列,這里顯然是報錯的,因為蛋白序列沒有這一屬性
print ("Protein reverse complement: ", protein_seq.complement())
7 用 Biopython 將 DNA 翻譯為 RNA
# =====轉錄=====
# 如果序列為編碼鏈,那么直接轉換
print ("rna: ", dna_seq.transcribe())
# 如果序列為模板鏈,就需要先轉為編碼鏈
transcribe_seq = dna_seq.reverse_complement().transcribe()
print ("rna: ", transcribe_seq)
8 用BioPython 將 RNA 翻譯為 蛋白質
# =====翻譯=====
print ("protein: ", transcribe_seq.translate())
# 如果翻譯的是線粒體密碼子,那么在參數中需要輸入,其他參考 https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=c or ftp://ftp.ncbi.nlm.nih.gov/entrez/misc/data/gc.prt
print ("protein: ", transcribe_seq.translate(table="Vertebrate Mitochondrial"))
# 在現實生物世界中,一般在遇到終止密碼子之后的序列不用翻譯
print ("protein: ", transcribe_seq.translate(table="Vertebrate Mitochondrial", to_stop=True))
# 如果DNA序列為編碼序列,可以直接翻譯,DNA序列不是3的倍數時,報錯
print ("protein: ", dna_seq.translate())
# 在細菌世界中,在細菌遺傳密碼中 GTG 是個有效的起始密碼子,注意第一個密碼子(正常情況下 GTG編碼纈氨酸, 但是如果作為起始密碼子,則翻譯成甲硫氨酸)
bacterial_dna = Seq("GTGAAAAAGATGCAATCTATCGTACTCGCACTTTCCCTGGTTCTGGTCGCTCCCATGGCATAA", generic_dna)
print ("protein: ", bacterial_dna.translate(table="Bacterial", to_stop=True))
print ("protein: ", bacterial_dna.translate(table="Bacterial", cds=True))
7 做一些有意思的事
# =====尋找TATA框=====
# TATA框約在多數真核生物基因轉錄起始點上游約-30bp(-25~-32bp)處,基本上由A-T堿基對組成,是決定基因轉錄始的選擇,為RNA聚合酶的結合處之一
print ("TA Counts: ", dna_seq.count("TA"))
# =====GC含量=====
# (A+T)/(G+C)之比隨DNA的種類不同而異。GC含量愈高,DNA的密度也愈高,同時熱及堿不易使之變性,因此利用這一特性便可進行DNA的分離或測定。
print ("GC Contenten", 100 * float(dna_seq.count("G") + dna_seq.count("C")) / len(dna_seq))
# =====得到promoter序列=====
# 在尋找基因的promoter時(一般promoter的位點不確定),但是可以通過將起始位點左右2kb基因視為promoter
# 這里訓練切取,將切取設起始位點為前10bp
print ("Promoter seq: ",dna_seq[:10])