私は、Python と Biopython の両方に慣れていないということから始めなければなりません。大きな .fasta ファイル (複数のエントリを持つ) を、それぞれに 1 つのエントリを持つ単一のファイルに分割しようとしています。Biopython wiki/Cookbook サイトで次のコードのほとんどを見つけ、少しだけ変更しました。私の問題は、このジェネレーターがそれらに「1.fasta」、「2.fasta」などの名前を付けていることです。GI番号などの識別子で名前を付ける必要があります。
def batch_iterator(iterator, batch_size) :
"""Returns lists of length batch_size.
This can be used on any iterator, for example to batch up
SeqRecord objects from Bio.SeqIO.parse(...), or to batch
Alignment objects from Bio.AlignIO.parse(...), or simply
lines from a file handle.
This is a generator function, and it returns lists of the
entries from the supplied iterator. Each list will have
batch_size entries, although the final list may be shorter.
"""
entry = True #Make sure we loop once
while entry :
batch = []
while len(batch) < batch_size :
try :
entry = next(iterator)
except StopIteration :
entry = None
if entry is None :
#End of file
break
batch.append(entry)
if batch :
yield batch
from Bio import SeqIO
infile = input('Which .fasta file would you like to open? ')
record_iter = SeqIO.parse(open(infile), "fasta")
for i, batch in enumerate(batch_iterator(record_iter, 1)) :
outfile = "c:\python32\myfiles\%i.fasta" % (i+1)
handle = open(outfile, "w")
count = SeqIO.write(batch, handle, "fasta")
handle.close()
交換しようとすると:
outfile = "c:\python32\myfiles\%i.fasta" % (i+1)
と:
outfile = "c:\python32\myfiles\%s.fasta" % (record_iter.id)
SeqIO の seq_record.id に似た名前になるようにすると、次のエラーが発生します。
Traceback (most recent call last):
File "C:\Python32\myscripts\generator.py", line 33, in [HTML]
outfile = "c:\python32\myfiles\%s.fasta" % (record_iter.id)
AttributeError: 'generator' object has no attribute 'id'
ジェネレーター関数には属性「id」がありませんが、どうにか回避できますか? このスクリプトは、私がやろうとしていることに対して複雑すぎますか?!? ありがとう、チャールズ