我试过通过各种方法打开它,但我相信 TabularMSA.read() 应该允许文件或文件句柄。
你是对的:scikit-bio 通常支持使用打开的文件句柄或文件路径读取和写入文件。
您遇到的问题是您的第一次TabularMSA.read()
调用读取了打开文件句柄的全部内容,因此当第二次TabularMSA.read()
调用在except
块内被命中时,文件指针已经位于打开文件句柄的末尾 - 这这就是为什么您会收到一条提示文件为空的错误消息。
这种行为是故意的;当 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
将被捕获并忽略。