Biopython - 一次读取固定数量的seq_records

时间:2012-07-05 16:46:29

标签: biopython fastq

我构建了一些代码,用于从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中获取信息并再次执行循环。我无法理解如何完成这项工作。有什么想法吗?

1 个答案:

答案 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)