附录:关于 Python 的有用信息

如果你没有花很多时间用 Python 编程,在使用 Biopython 时遇到的许多问题和问题通常与 Python 本身有关。本节试图介绍一些经常出现的想法和代码(至少对我们来说!),这些代码在使用 Biopython 库时经常出现。如果你有任何对这里有用指针的建议,请贡献!

到底什么是句柄?

在整个文档中经常提到句柄,而且它们也很混乱(至少对我来说!)。基本上,你可以将句柄视为文本信息的“包装器”。

句柄至少比普通文本信息提供两个好处

  1. 它们提供了一种标准方法来处理以不同方式存储的信息。文本信息可以保存在文件中,也可以保存在内存中的字符串中,或者来自命令行程序的输出,或者在某个远程网站上,但是句柄提供了一种通用方法来处理所有这些格式的信息。

  2. 它们允许以增量方式读取文本信息,而不是一次性读取所有信息。当你处理巨大的文本文件时,这非常重要,因为如果你必须一次性加载所有文件,它们会占用你所有的内存。

句柄可以处理正在读取(例如从文件读取)或写入(例如写入文件)的文本信息。在“读取”句柄的情况下,常用的函数是 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.SeqIOBio.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.