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

时间:2017-09-01 16:55:39

标签: skbio

嘿有skbio队。

所以我需要允许DNA或RNA MSA。当我执行以下操作时,如果我遗漏了alignment_fh.close(),skbio会读取'非标题'在except块中的行让我觉得我需要先关闭文件,所以它会从头开始,但是如果我添加了alignment_fh.close(),我就无法读取它了。我尝试通过各种方法打开它,但我相信TabularMSA.read()应该允许文件或文件句柄。思考?谢谢!

λ: >:t instance
<interactive>:1:1: error: parse error on input ‘instance’
λ: >:i instance
<interactive>:1:1: error: parse error on input ‘instance’

1 个答案:

答案 0 :(得分:2)

  

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

您是正确的:scikit-bio通常支持使用打开的文件句柄或文件路径读取和写入文件。

您遇到的问题是,您的第一个TabularMSA.read()调用会读取打开文件句柄的全部内容,以便在{{1}内遇到第二个TabularMSA.read()调用时阻止,文件指针已经在打开文件句柄的末尾 - 这就是为什么你得到一条错误消息,暗示文件是空的。

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

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

您可以使用文件路径或文件句柄来实现目标。在以下示例中,假设exceptaln_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) 而不是&#34; catch-all&#34; except ValueError声明。我建议捕获特定的错误类型(例如except)而不是任何异常,因为代码可能会以不同于您预期的方式失败。例如,使用&#34; catch-all&#34; ValueError声明,用户无法使用except中断您的计划,因为Ctrl-C会被捕获并被忽略。