MafftCommandline 和 io.StringIO

MafftCommandline and io.StringIO

我一直在尝试使用 Bio.Align.Applications 中的 Mafft 对齐工具。目前,我已经成功地将序列信息写入临时文本文件,然后由 MafftCommandline() 读取这些文件。但是,我想尽可能避免多余的步骤,所以我一直在尝试写入内存文件,而不是使用 io.StringIO()。这是我一直遇到问题的地方。我无法让 MafftCommandline() 读取 io.StringIO() 生成的内部文件。我已确认内部文件与 AlignIO.read() 等函数兼容。以下是我的测试代码:

from Bio.Align.Applications import MafftCommandline
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
import io
from Bio import AlignIO


sequences1 = ["AGGGGC",
             "AGGGC",
             "AGGGGGC",
             "AGGAGC",
             "AGGGGG"]

longest_length = max(len(s) for s in sequences1)
padded_sequences = [s.ljust(longest_length, '-') for s in sequences1] #padded sequences used to test compatibilty with AlignIO

ioSeq = ''
for items in padded_sequences:
    ioSeq += '>unknown\n'
    ioSeq += items + '\n'

newC = io.StringIO(ioSeq)
cLoc = str(newC).strip()
cLocEdit = cLoc[:len(cLoc)] #create string to remove < and >

test1Handle = AlignIO.read(newC, "fasta")
#test1HandleString = AlignIO.read(cLocEdit, "fasta") #fails to interpret cLocEdit string

records = (SeqRecord(Seq(s)) for s in padded_sequences)

SeqIO.write(records, "msa_example.fasta", "fasta")

test1Handle1 = AlignIO.read("msa_example.fasta", "fasta") #alignIO same for both #demonstrates working AlignIO

in_file = '.../msa_example.fasta'
mafft_exe = '/usr/local/bin/mafft'

mafft_cline = MafftCommandline(mafft_exe, input=in_file) #have to change file path
mafft_cline1 = MafftCommandline(mafft_exe, input=cLocEdit) #fails to read string (same as AlignIO)
mafft_cline2 = MafftCommandline(mafft_exe, input=newC)

stdout, stderr = mafft_cline()
print(stdout) #corresponds to MafftCommandline with input file
stdout1, stderr1 = mafft_cline1()
print(stdout1) #corresponds to MafftCommandline with internal file

我收到以下错误消息:

ApplicationError:来自“/usr/local/bin/mafft <_io.StringIO object at 0x10f439798>”的非零 return 代码 2,消息“/bin/sh:-c:第 0 行:意外标记“换行符”附近的语法错误” 我相信这是由于文件路径中存在箭头(“<”和“>”)造成的。

ApplicationError:来自“/usr/local/bin/mafft“_io.StringIO 0x10f439af8 处的对象”的非零 return 代码 1,消息“/usr/local/bin/mafft:无法打开 _io.StringIO 0x10f439af8 处的对象。 试图通过将文件路径转换为字符串和索引来删除箭头导致上述错误。

最终我的目标是减少计算时间。我希望通过调用内部存储器而不是写入单独的文本文件来完成此操作。非常感谢有关我的目标的任何建议或反馈。提前致谢。

I can't get MafftCommandline() to read internal files made by io.StringIO().

这并不奇怪,原因如下:

  1. 如您所知,Biopython 没有实现 Mafft,它只是 提供了一个方便的界面来设置对 mafft 的调用 /usr/local/binmafft 可执行文件作为单独的进程运行 无法访问您的 Python 程序的内部存储器, 包括你的 StringIO 文件。

  2. mafft 程序只能使用输入文件,它甚至不能 允许 stdin 作为数据源。 (尽管它确实允许 stdout 作为 数据接收器。)所以最终,文件系统中必须有一个文件 为 mafft 打开。因此需要你的临时文件。

也许tempfile.NamedTemporaryFile() or tempfile.mkstemp()是一个合理的妥协。