所以我需要允许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’
答案 0 :(得分:2)
我尝试通过各种方法打开它,但我相信TabularMSA.read()应该允许文件或文件句柄。
您是正确的:scikit-bio通常支持使用打开的文件句柄或文件路径读取和写入文件。
您遇到的问题是,您的第一个TabularMSA.read()
调用会读取打开文件句柄的全部内容,以便在{{1}内遇到第二个TabularMSA.read()
调用时阻止,文件指针已经在打开文件句柄的末尾 - 这就是为什么你得到一条错误消息,暗示文件是空的。
这种行为是故意的;当scikit-bio被赋予一个打开的文件句柄时,它将读取或写入文件,但不会尝试管理句柄的文件指针(该类型的管理由代码的调用者决定) )。
现在,当要求scikit-bio读取文件路径(即包含磁盘上文件路径或某些URI可访问的字符串)时,scikit-bio将处理打开和关闭文件句柄,所以通常更容易。
您可以使用文件路径或文件句柄来实现目标。在以下示例中,假设except
是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)
而不是&#34; catch-all&#34; except ValueError
声明。我建议捕获特定的错误类型(例如except
)而不是任何异常,因为代码可能会以不同于您预期的方式失败。例如,使用&#34; catch-all&#34; ValueError
声明,用户无法使用except
中断您的计划,因为Ctrl-C
会被捕获并被忽略。