如何连接由Bio.SeqIO.index创建的两个或多个字典?



我希望能够连接存储在"indata"one_answers"pairdata"中的两个"字典",但是这个代码,

indata = SeqIO.index(infile, infmt)
pairdata = SeqIO.index(pairfile, infmt)
indata.update(pairdata)

产生以下错误:

indata.update(pairdata)
TypeError: update() takes exactly 1 argument (2 given)

我试过使用

indata = SeqIO.to_dict(SeqIO.parse(infile, infmt))
pairdata = SeqIO.to_dict(SeqIO.parse(pairfile, infmt))
indata.update(pairdata)

确实可以工作,但是生成的字典占用了太多的内存,对于我所拥有的infile和pairfile的大小来说是不实用的。

最后一个选项是:

indata = SeqIO.index_db(indexfile, [infile, pairfile], infmt)

可以很好地工作,但是非常慢。有人知道我如何/是否可以成功地从上面的第一个例子连接两个索引吗?

SeqIO.index返回一个只读的类字典对象,因此update将无法处理它(为令人困惑的错误消息道歉;我刚刚检查了一个修复到主bioppython存储库)。

最好的方法是使用index_db,这样会慢一些,但是只需要索引文件一次,或者定义一个更高级别的对象它就像你的多个文件的字典。这是一个简单的例子:

from Bio import SeqIO
class MultiIndexDict:
    def __init__(self, *indexes):
        self._indexes = indexes
    def __getitem__(self, key):
        for idx in self._indexes:
            try:
                return idx[key]
            except KeyError:
                pass
        raise KeyError("{0} not found".format(key))
indata = SeqIO.index("f001", "fasta")
pairdata = SeqIO.index("f002", "fasta")
combo = MultiIndexDict(indata, pairdata)
print combo['gi|3318709|pdb|1A91|'].description
print combo['gi|1348917|gb|G26685|G26685'].description
print combo["key_failure"]

如果您不打算再次使用索引,并且内存不是限制(在您的情况下似乎都是真的),您可以告诉Bio.SeqIO.index_db(…)使用内存中的SQLite3索引,其特殊索引名称为":memory:",如下所示:

indata = SeqIO.index_db(":memory:", [infile, pairfile], infmt)

其中infile和pairfile是文件名,infmt是在Bio中定义的格式类型。SeqIO(如。"fasta")。

这实际上是Python的SQLite3库的一个通用技巧。对于一小部分文件,这应该比在磁盘上构建SQLite索引要快得多。

最新更新