我希望能够加入存储在“indata”和“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)
效果很好,但速度很慢。有谁知道我是否可以成功加入上面第一个例子中的两个索引?
答案 0 :(得分:2)
SeqIO.index
返回一个只读字典的对象,因此update
将不会对它起作用(对于令人困惑的错误消息道歉;我刚刚检查了主要Biopython存储库的修复程序) )。
最好的方法是使用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"]
答案 1 :(得分:1)
在你不打算再次使用索引并且内存不是限制(在你的情况下似乎都是真的),你可以告诉Bio.SeqIO.index_db(...)使用in内存SQLite3索引,特殊索引名称为“:memory:”,如下所示:
indata = SeqIO.index_db(":memory:", [infile, pairfile], infmt)
其中infile和pairfile是文件名,infmt是Bio.SeqIO中定义的格式类型(例如“fasta”)。
这实际上是Python的SQLite3库的一般技巧。对于一小组文件,这应该比在磁盘上构建SQLite索引快得多。