2

「indata」と「pairdata」に格納された2つの「辞書」を結合できるようにしたいのですが、このコード、

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)

これは完全に機能しますが、非常に遅いです。上記の最初の例から2つのインデックスを正常に結合する方法/かどうかを知っている人はいますか?

4

2 に答える 2

2

SeqIO.indexは読み取り専用の辞書のようなオブジェクトを返すため、update動作しません (紛らわしいエラー メッセージで申し訳ありません。メインの Biopython リポジトリにその修正をチェックインしました)。

最善の方法は、index_db を使用することです。これは遅くなりますが、ファイルのインデックスを作成する必要があるのは 1 回だけです。または、複数のファイルに対して辞書のように機能するより高いレベルのオブジェクトを定義することもできます。簡単な例を次に示します。

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"]
于 2011-10-27T14:11:40.443 に答える
1

インデックスを再度使用する予定がなく、メモリが制限ではない場合 (どちらもあなたのケースでは当てはまるようです)、Bio.SeqIO.index_db(...) にメモリ内 SQLite3 インデックスを使用するように指示できます。特別なインデックス名 ":memory:" を次のように付けます:

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

ここで、infile と pairfile はファイル名であり、infmt は Bio.SeqIO で定義されているフォーマット タイプです (例: "fasta")。

これは、実際には Python の SQLite3 ライブラリの一般的なトリックです。ファイルのセットが小さい場合、これはディスク上に SQLite インデックスを構築するよりもはるかに高速です。

于 2011-10-28T08:14:10.663 に答える