2012-07-05 38 views
0

我構建了一些代碼,用於從fastq文件中檢索PHRED得分,將它們全部放入單個列表中,然後將列表傳遞給另一個函數。它看起來像這樣:Biopython - 一次讀取固定數量的seq_records

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檢索。爲了更加保守內存,我希望有一些代碼能夠一次讀取較少數量的seq_records(比如100),然後將他們各自的質量分數彈出到我正在進行的uberlist中。然後它會從下一個100個seq_records獲取信息並再次執行循環。我無法理解如何完成這項工作。有任何想法嗎?

回答

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)