2017-09-05 127 views
1

我正在研究一個大的fasta文件,我想根據基因ID拆分爲多個文件。我試圖從biopython教程使用上面的腳本:將大型fasta文件拆分爲多個文件的biopython腳本

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 = iterator.next() 
      except StopIteration: 
       entry = None 
      if entry is None: 
       # End of file 
       break 
      batch.append(entry) 
     if batch: 
      yield batch 

record_iter=SeqIO.parse(open('/path/sorted_sequences.fa'), 'fasta') 
for i, batch in enumerate (batch_iterator(record_iter, 93)): 
    filename='gene_%i.fasta' % (i + 1) 
    with open('/path/files/' + filename, 'w') as ouput_handle: 
     count=SeqIO.write(batch, ouput_handle, 'fasta') 
    print ('Wrote %i records to %s' % (count, filename)) 

它不會對文件93序列中它們分割,但它給每93.我不能看到錯誤2個文件,但我想有一個。 還有另一種方法可以用不同的方式分割大型fasta文件嗎? 感謝

+0

你是什麼意思,它給每個93組2個文件? – rodgdor

+0

該腳本產生重複文件,即2個文件,每個文件包含93個基因,每個文件都帶有gene_1。我知道每個都有93個。所以在生成第一個93序列文件之後,應該移到下一個93,但我不這樣做。 – Ana

回答

1

閱讀代碼的例子後,迭代器似乎並沒有單獨的文件每基因ID,但只是使序列的divition在batch_size組,所以你的情況每個文件93個序列。

+0

這就是我的想法。但作爲一個新手,我認爲每個基因都有一個序列,因此它會將它們分開。該文件按前93個序列對應於gene_1和下一個93對應另一個gene.id等的方式進行排序。無論如何,我可以按照我想要的方式將它們分離出來嗎?謝謝 – Ana

+0

@Ana你可以,有幾種方法可以做到這一點。這將取決於你是否已經知道所有基因的名字,或者你是否需要先取得它們。然後,您可以根據您擁有的不同基因的數量(緩慢的過程)解析文件的次數,或者您可以考慮更爲巧妙的方式。我建議你嘗試去做,如果你被阻止,可以在這裏或者在biostars上發佈一個問題,用你試過的代碼和你的錯誤或阻塞。 – rodgdor

+0

我知道基因的名稱,因爲我之前修改過它們。我想有很多方法可以做到這一點,但我沒有太多的文件處理python文件。 – Ana

1

未來有人對此腳本感興趣。這個腳本完全按照它的方式工作。問題在於我試圖分割的文件比它應該有更多的序列。所以我刪除了壞文件,並生成了一個與上面的腳本很好地分離的新文件。

相關問題