附錄:關於 Python 的實用資訊
如果你沒有花費太多時間使用 Python 編程,那麼在使用 Biopython 時出現的許多問題通常與 Python 本身有關。本節試圖提出一些在使用 Biopython 函式庫時經常出現(至少對我們而言!)的想法和程式碼。如果您對此處可以放入的實用提示有任何建議,請貢獻!
什麼是 handle?
在整份文件中,handle 被頻繁提及,而且也相當令人困惑(至少對我來說!)。基本上,您可以將 handle 視為文字資訊的「包裝器」。
與純文字資訊相比,handle 提供(至少)兩個優點
它們提供了一種處理以不同方式儲存的資訊的標準方式。文字資訊可以在檔案中、在記憶體中儲存的字串中、在命令列程式的輸出中,或在某些遠端網站上,但 handle 提供了一種處理所有這些格式的資訊的通用方式。
它們允許以增量方式讀取文字資訊,而不是一次全部讀取。當您處理會佔用所有記憶體的大型文字檔案時,這非常重要,因為您必須全部載入它們。
Handle 可以處理正在讀取(例如從檔案讀取)或寫入(例如將資訊寫入檔案)的文字資訊。在「讀取」handle 的情況下,常用的函式是 read()
,它從 handle 讀取整個文字資訊,以及 readline()
,它一次讀取一行資訊。對於「寫入」handle,通常使用函式 write()
。
handle 最常見的用法是從檔案讀取資訊,這是使用內建的 Python 函式 open
完成的。在這裡,我們處理檔案 m_cold.fasta
,您可以從這裡下載(或在 Biopython 原始碼中找到,作為 Doc/examples/m_cold.fasta
)。
>>> handle = open("m_cold.fasta", "r")
>>> handle.readline()
">gi|8332116|gb|BE037100.1|BE037100 MP14H09 MP Mesembryanthemum ...\n"
Handle 經常在 Biopython 中用於將資訊傳遞給解析器。例如,自 Biopython 1.54 以來,Bio.SeqIO
和 Bio.AlignIO
中的主要函式允許您使用檔案名稱而不是 handle
from Bio import SeqIO
for record in SeqIO.parse("m_cold.fasta", "fasta"):
print(record.id, len(record))
在較舊版本的 Biopython 中,您必須使用 handle,例如
from Bio import SeqIO
handle = open("m_cold.fasta", "r")
for record in SeqIO.parse(handle, "fasta"):
print(record.id, len(record))
handle.close()
這種模式仍然很有用 - 例如,假設您有一個要解析的 gzip 壓縮的 FASTA 檔案
import gzip
from Bio import SeqIO
handle = gzip.open("m_cold.fasta.gz", "rt")
for record in SeqIO.parse(handle, "fasta"):
print(record.id, len(record))
handle.close()
對於我們的純文字檔案解析器,必須以文字模式使用 gzip(預設是二進位模式)。
請參閱第 從壓縮檔案解析序列 節以取得更多類似的範例,包括讀取 bzip2 壓縮檔案。
從字串建立 handle
一個有用的事情是能夠將字串中包含的資訊轉換為 handle。以下範例示範如何使用 Python 標準函式庫中的 StringIO
來完成此操作
>>> my_info = "A string\n with multiple lines."
>>> print(my_info)
A string
with multiple lines.
>>> from io import StringIO
>>> my_info_handle = StringIO(my_info)
>>> first_line = my_info_handle.readline()
>>> print(first_line)
A string
>>> second_line = my_info_handle.readline()
>>> print(second_line)
with multiple lines.