在 skbio 中打开文件句柄以与 TabularMSA 一起使用

Posted

技术标签:

【中文标题】在 skbio 中打开文件句柄以与 TabularMSA 一起使用【英文标题】:Opening filehandles for use with TabularMSA in skbio 【发布时间】:2017-09-01 16:55:38 【问题描述】:

嘿,skbio 团队。

所以我需要允许 DNA 或 RNA MSA。当我执行以下操作时,如果我省略了 alignment_fh.close() skbio 会读取 except 块中的“非标题”行,这让我认为我需要先关闭文件,以便它从头开始,但如果我添加alignment_fh.close() 我无法让它读取文件。我试过通过各种方法打开它,但我相信 TabularMSA.read() 应该允许文件或文件句柄。想法?谢谢!

try:
    aln = skbio.TabularMSA.read(alignment_fh, constructor=skbio.RNA)
except:
    alignment_fh.close()
    aln = skbio.TabularMSA.read(alignment_fh, constructor=skbio.DNA)

【问题讨论】:

【参考方案1】:

我尝试通过多种方法打开它,但我相信 TabularMSA.read() 应该允许文件或文件句柄。

你说得对:scikit-bio 通常支持使用打开的文件句柄或文件路径来读写文件。

您遇到的问题是您的第一个 TabularMSA.read() 调用读取了打开文件句柄的全部内容,因此当在 except 块内命中第二个 TabularMSA.read() 调用时,文件指针为已经在打开文件句柄的末尾 - 这就是为什么您会收到一条提示文件为空的错误消息。

这种行为是故意的;当 scikit-bio 被赋予一个打开的文件句柄时,它将读取或写入文件,但不会尝试管理句柄的文件指针(这种管理类型取决于代码的调用者)。

现在,当要求 scikit-bio 读取 文件路径(即包含磁盘上文件的路径或可通过某个 URI 访问的字符串)时,scikit-bio 将处理打开和关闭文件句柄,所以这通常是更简单的方法。

您可以使用文件路径或文件句柄来实现您的目标。在以下示例中,假设aln_filepath 是一个str,指向磁盘上的对齐文件(例如"/path/to/my/alignment.fasta")。

使用文件路径:您可以简单地将文件路径传递给两个TabularMSA.read() 调用;您无需拨打open()close()

try:
    aln = skbio.TabularMSA.read(aln_filepath, constructor=skbio.RNA)
except ValueError:
    aln = skbio.TabularMSA.read(aln_filepath, constructor=skbio.DNA)

使用文件句柄:在第二次读取之前,您需要打开文件句柄并重置 except 块中的文件指针。

with open(aln_filepath, 'r') as aln_filehandle:
    try:
        aln = skbio.TabularMSA.read(aln_filehandle, constructor=skbio.RNA)
    except ValueError:
        aln_filehandle.seek(0)  # reset file pointer to beginning of file
        aln = skbio.TabularMSA.read(aln_filehandle, constructor=skbio.DNA)

注意:在这两个示例中,我都使用了except ValueError,而不是“catch-all”except 语句。我建议捕获特定的错误类型(例如ValueError)而不是任何异常,因为代码可能以不同于您预期的方式失败。例如,使用“catch-all”except 语句,用户将无法使用 Ctrl-C 中断您的程序,因为 KeyboardInterrupt 将被捕获并忽略。

【讨论】:

这听起来像是一个关于 StringIO 的单独问题,不一定与 scikit-bio 相关。您可以使用重现问题的最小代码示例发布一个新问题吗? 我可能在您发布的同时删除了我的评论,抱歉。我想通了,文件句柄示例是完美的。因为我的单元测试和文件的行为不同而感到困惑。谢谢!

以上是关于在 skbio 中打开文件句柄以与 TabularMSA 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

latex 用tabular创建的表格如何加一个标题

Skbio python模块支持python 2

怎么得到已经打开的文件的句柄

Needleman-Wunsch 实现在 cogent 和 skbio 中给出了不同的对齐方式

如何删除已打开句柄的文件?

查找当前打开的文件句柄数(不是 lsof)