0

我构建了一些从 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 个),然后将它们各自的质量分数弹出到我正在进行的 uberlist 中。然后它将从接下来的 100 个 seq_records 中获取信息并再次执行循环。我无法理解如何完成这项工作。有任何想法吗?

4

1 回答 1

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)
于 2013-05-09T17:26:42.657 回答