2017-09-13 11 views
2

私はPython 2.6.6を使用していますが、fastqの読み取りを、file2で、file1で重複している(つまり一致しています)を削除しようとしています。ここで私が実装しようとしているコードは次のとおりです。SeqIO.indexによって生成された辞書から項目を削除する

ref_reads = SeqIO.index("file1.fastq", "fastq") 
spk_reads = SeqIO.index("file2.fastq", "fastq") 

for spk in spk_reads: 
    if spk in ref_reads: 
    del ref_reads[spk] 

はしかし、私はdelの私の使用に関連し、このエラーを取得する:

はAttributeError:_IndexedSeqFileDictインスタンスが

です何の属性 '__delitem__' がありません現在の処方を使用してアイテムを削除することは可能ですか? SeqIO.index()を使用して生成された辞書からアイテムを削除するにはどうすればよいですか?

私も次のことを試してみました:

# import read data 
ref_reads = SeqIO.index("main.fastq", "fastq") 
spk_reads = SeqIO.index("over.fastq", "fastq") 

# note that ref_reads.keys() doesn't return a list but a 'dictionary-  keyiterator', 
# so we turn it into a set to work with it 
ref_keys = set(ref_reads.keys()) 
spk_keys = set(spk_reads.keys()) 

# loop to remove overlap reads 
for spk in spk_keys: 
    if spk in ref_keys: 
     del ref_keys[spk] 

# output data 
output_handle = open(fname_out, "w") 
SeqIO.write(ref_reads[ref_keys], output_handle, "fastq") 
output_handle.close() 

答えて

1

SeqIO.index()が真の辞書を返しますが、a dictionary like object, giving the SeqRecord objects as valuesしません:

Note that this pseudo dictionary will not support all the methods of a true Python dictionary, for example values() is not defined since this would require loading all of the records into memory at once.

オブジェクトのようなこの辞書は_IndexedSeqFileDictインスタンスです。ドキュメンテーション文字列は言及:あなたのファイルはSeqIO.parse()で作業ほど大きい場合

from Bio import SeqIO 

ref_reads = SeqIO.parse("file1.fastq", "fastq") 
spk_reads = SeqIO.parse("file1.fastq", "fastq") 

ref_reads_dict = SeqIO.to_dict(ref_reads) 

for spk in spk_reads: 
    if spk.id in ref_reads_dict: 
     del ref_reads_dict[spk.id] 

Note that this dictionary is essentially read only. You cannot add or change values, pop values, nor clear the dictionary.

だから、あなたはSeqIO.parse()SeqIO.to_dict()を使用してメモリ内のPythonの辞書にあなたのFASTQファイルを変換する必要がありますその後、私はこのような何かをするだろう、現実的ではありません。

from Bio import SeqIO 

ref_reads = SeqIO.index("file1.fastq", "fastq") 
spk_reads = SeqIO.index("file2.fastq", "fastq") 

# note that ref_reads.keys() doesn't return a list but a 'dictionary-keyiterator', 
# so we turn it into a set to work with it 
ref_keys = set(ref_reads.keys()) 
spk_keys = set(spk_reads.keys()) 

unique_ref_keys = ref_keys - spk_keys 

# this step might take a long time if your files are large 
unique_ref_reads = {key: ref_reads[key] for key in unique_ref_keys} 

編集、あなたのコメントへの回答:

how can I again solve the original problem of deleting items from SeqIO.index("file1.fastq", "fastq")?

私は上記のようには、SeqIO.index("file1.fastq", "fastq")読み取り専用_IndexedSeqFileDictオブジェクトを返します。だからできません、設計から、それから項目を削除します。

下の更新されたコードは、重複する読み取りが削除された新しいfastqファイルを作成する方法を示しています。

新しいオブジェクトが本当に必要な場合は、このファイルをSeqIO.index()でもう一度読むことができます。

from Bio import SeqIO 

ref_reads = SeqIO.index("file1.fastq", "fastq") 
spk_reads = SeqIO.index("file2.fastq", "fastq") 

ref_keys = set(ref_reads.keys()) 
spk_keys = set(spk_reads.keys()) 

unique_ref_keys = ref_keys - spk_keys 

# conserve memory by using a generator expression 
unique_ref_records = (ref_reads[key] for key in unique_ref_keys) 

# output new file with overlapping reads removed 
with open(fname_out, "w") as output_handle: 
    SeqIO.write(unique_ref_records , output_handle, "fastq") 

# optionally, create a new SeqIO.index() object 
unique_ref_reads = SeqIO.index(fname_out, "fastq") 
+0

Thnkあなたに役立つアドバイスをお願いします。最初の解決策は機能しましたが、私が改善しようとしているコードに比べて遅かったです。 2番目のコードブロックに関する追加情報を提供してください。私もfile2.fastqにあるfile1.fastqから読み込みを取り除こうとしています。あなたの2番目の解決策に基づいて、SeqIO.index( "file1.fastq"、 "fastq")からアイテムを削除するという元の問題をもう一度解決するにはどうしたらいいですか?私は最近の試みを反映するために質問を更新しました。 – wa3j

+0

@ wa3j:上記の私の編集を参照してください。 – BioGeek

関連する問題