我构建了一些代码,用于从fastq文件中检索PHRED分数,将它们全部放入单个列表中,然后将列表传递给另一个函数。它看起来像这样:
def PHRED_get():
temp_scores = []
all_scores = []
fastq_location
print("Building PHRED score bins...")
for seq_record in SeqIO.parse(fastq_location, "fastq"):
temp_scores = seq_record.letter_annotations
temp_scores = temp_scores['phred_quality']
all_scores.append(temp_scores)
all_scores = list(itertools.chain(*all_scores))
score_bin_maker(all_scores)
问题是这个循环将继续,直到搜索完所有seq_records并检索到相应的PHRED分数。为了更加保守RAM,我想让一些代码一次读取少量的seq_records(比方说100),然后将他们各自的质量分数弹出到我正在进行的超级列表中。然后它将从下一个100 seq_records中获取信息并再次执行循环。我无法理解如何完成这项工作。有什么想法吗?
答案 0 :(得分:1)
简单 :保留一个计数器,当它达到100时,从循环中断。或者像if len(temp_scores) > 1000: break
这样的其他一些早期停止条件也会起作用。
优雅 :使用itertools.islice从迭代器中获取前100条记录,
import itertools
def PHRED_get():
temp_scores = []
all_scores = []
fastq_location
print("Building PHRED score bins...")
for seq_record in itertools.islice(SeqIO.parse(fastq_location, "fastq"), 100):
temp_scores = seq_record.letter_annotations
temp_scores = temp_scores['phred_quality']
all_scores.append(temp_scores)
all_scores = list(itertools.chain(*all_scores))
score_bin_maker(all_scores)