我一直在尝试使用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:来自&#39; / usr / local / bin / mafft&lt; _io.StringIO对象的非零返回码2,位于0x10f439798&gt;&#39;,消息&#34; / bin / sh:-c :第0行:意外令牌`换行符&#39;&#34;附近的语法错误 我认为这是因为文件路径中存在箭头(&#39;&#39;&#39;&#39;&#39;)。
ApplicationError:来自&#39; / usr / local / bin / mafft&#34; _io.StringIO对象的非零返回码1,位于0x10f439af8&#34;&#39;,message&#39; / usr / local / bin / mafft:无法在0x10f439af8处打开_io.StringIO对象。&#39; 尝试通过将文件路径转换为字符串和索引来删除箭头导致上述错误。
最终我的目标是减少计算时间。我希望通过调用内部存储器而不是写入单独的文本文件来实现此目的。任何有关我的目标的建议或反馈都非常感谢。提前谢谢。
答案 0 :(得分:3)
我无法让MafftCommandline()读取内部文件 io.StringIO()。
出于以下几个原因,这并不奇怪:
如你所知,Biopython并没有实现Mafft
提供了一个方便的界面来设置对mafft
的调用
/usr/local/bin
。 mafft
可执行文件作为单独的进程运行
无法访问Python程序的内部存储器,
包括你的StringIO文件。
mafft程序仅适用于输入文件,甚至不适用
允许stdin
作为数据源。 (虽然它允许stdout
作为
数据接收器。)所以最终,文件系统中必须有一个文件
让mafft
打开。因此需要您的临时文件。
或许tempfile.NamedTemporaryFile()
or tempfile.mkstemp()
可能是合理的妥协。