附录:关于 Python 的有用信息
如果你没有花很多时间用 Python 编程,在使用 Biopython 时遇到的许多问题和问题通常与 Python 本身有关。本节试图介绍一些经常出现的想法和代码(至少对我们来说!),这些代码在使用 Biopython 库时经常出现。如果你有任何对这里有用指针的建议,请贡献!
到底什么是句柄?
在整个文档中经常提到句柄,而且它们也很混乱(至少对我来说!)。基本上,你可以将句柄视为文本信息的“包装器”。
句柄至少比普通文本信息提供两个好处
它们提供了一种标准方法来处理以不同方式存储的信息。文本信息可以保存在文件中,也可以保存在内存中的字符串中,或者来自命令行程序的输出,或者在某个远程网站上,但是句柄提供了一种通用方法来处理所有这些格式的信息。
它们允许以增量方式读取文本信息,而不是一次性读取所有信息。当你处理巨大的文本文件时,这非常重要,因为如果你必须一次性加载所有文件,它们会占用你所有的内存。
句柄可以处理正在读取(例如从文件读取)或写入(例如写入文件)的文本信息。在“读取”句柄的情况下,常用的函数是 read()
,它从句柄读取所有文本信息,以及 readline()
,它一次读取一行信息。对于“写入”句柄, write()
函数经常使用。
句柄最常见的用途是从文件中读取信息,这使用 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"
句柄在 Biopython 中经常用于将信息传递给解析器。例如,自从 Biopython 1.54 以来, Bio.SeqIO
和 Bio.AlignIO
中的主要函数允许你使用文件名而不是句柄
from Bio import SeqIO
for record in SeqIO.parse("m_cold.fasta", "fasta"):
print(record.id, len(record))
在较旧的 Biopython 版本中,你必须使用句柄,例如
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 压缩文件,请参见 从压缩文件中解析序列 一节。
从字符串创建句柄
一件有用的事情是能够将包含在字符串中的信息转换为句柄。以下示例展示了如何使用 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.