在 skbio 中打开用于 TabularMSA 的文件句柄
Opening filehandles for use with TabularMSA in skbio
你好 skbio 团队。
所以我需要允许 DNA 或 RNA MSA。当我执行以下操作时,如果我遗漏了 alignment_fh.close() skbio 会读取 except 块中的 'non header' 行,这让我觉得我需要先关闭文件以便它从头开始,但是如果我添加 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)
I've tried opening it via a variety of methods, but I believe TabularMSA.read() should allow files OR file handles.
你是对的: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
将被捕获并被忽略。
你好 skbio 团队。
所以我需要允许 DNA 或 RNA MSA。当我执行以下操作时,如果我遗漏了 alignment_fh.close() skbio 会读取 except 块中的 'non header' 行,这让我觉得我需要先关闭文件以便它从头开始,但是如果我添加 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)
I've tried opening it via a variety of methods, but I believe TabularMSA.read() should allow files OR file handles.
你是对的: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
将被捕获并被忽略。