使用 python 3.x 如何在不写入文件的情况下将 Tree 对象从 ete3 传递到 DendroPy

Using python 3.x how can I pass a Tree object from ete3 to DendroPy without writing to file

我正在使用 python 中的 ete3 包从我用随机模型生成的数据构建系统发育树,它运行良好。我之前已经将这些树写成 newick 格式,然后使用另一个脚本(带有 Dendropy 包)来读取这些树并对它们进行一些分析。这两个脚本都可以正常工作。

我现在正在尝试进行大量此类数据处理,并想编写一个脚本来跳过文件写入。这两种方法都称为 Tree,因此我通过导入 dendropy 方法解决了这个问题,例如:

from dendropy import Tree as DTree

和 ete3 方法如:

from ete3 import Tree

好像还可以。

我的问题是如何将对象从一个包传递到另一个包。我有一个循环,其中我首先使用 ete3 方法构建树对象,我将其称为 't'。然后我的计划是使用 ete3 中的 Tree.write 方法使用 'get' 方法将树对象传递给 Dendropy 并跳过实际的输出文件位,如下所示:

treePass = t.write(format = 1)
DendroTree = DTree.get(treePass, schema = 'newick')

但这给出了错误:

    DendroTree = DTree.get(treePass)
TypeError: get() takes 1 positional argument but 2 were given

欢迎任何想法。

DTree.get()只接受self作为实参,其余通过关键字给出。这基本上意味着您不能将 treePass 作为参数传递给 DTree.get()。

我没有使用过这些库中的任何一个,但我找到了一种将数据导入 dendropy 树的方法 here

tree = DTree.get(data="((A,B),(C,D));",schema="newick")

这意味着您必须以这种格式从 ete3 获取您的树。对于一棵树来说,这似乎并不罕见,所以在仔细观察之后,ete3 似乎支持格式,您可以阅读 here。我相信是9号。

所以最后我会试试这个:

from dendropy import Tree as DTree
from ete3 import Tree

#do your Tree generation magic here
DendroTree = DTree.get(data=t.write(format = 9),schema = 'newick')

编辑:

随着我阅读的越来越多,我相信应该阅读任何格式,所以基本上您需要添加到您的示例中的是 data 此处:DendroTree = DTree.get(data=treePass, schema = 'newick')