2015-01-05 105 views
0

我正在循環訪問文本文件test.fasta的行,並且當我到達format1行時,我想要創建一個newFile1,跳過一行,然後編寫以下行的fnewFile1,直到我得到的format1另一條線,在這一點上,我想關閉newFile1,創建newfile2當循環創建該文件時關閉文件

我到目前爲止有:

import re 

with open('test.fasta', 'r') as seqs: 

    seqFile = (open('throwaway.txt', 'a+')) 

    for line in seqs: 
     if re.search('^>[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]', line): 
      seqFile.close() 
      seqFile = open('%s.fasta' % line, 'a+') 
      seqs.next() 
     else: 
      seqFile.write('%s' % line) 

    seqFile.close() 

此代碼的工作,並且輸出我期望的。麻煩的是,在我開始循環之前,我需要創建throwaway.txt文件,以便循環的第一次迭代不會失敗,因爲seqFile不存在。如果我不包含seqFile.close(),那麼我只是打開一堆文件。

我可以添加一個if語句,該語句只處理沒有文件打開的第一個迭代,但我想知道是否有更好的方法來完成它。

+0

'A +'如果文件未找到,則創建一個新文件。你在想什麼? –

+0

我在想我想創建一堆新文件 - 這是按預期工作的。這不是問題,問題是我想在將它們作爲循環的一部分完成後關閉這些文件。 – kevbonham

回答

0

對我來說,最直接的方法,以避免依賴於虛擬文件的存在是剛剛趕上第一次通過異常循環當您嘗試調用close

if re.search('^>[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]', line): 
    try: 
    seqFile.close() 
    except NameError: # Assuming you haven't set seqFile else where before the first time through the loop 
    pass 
    seqFile = open('%s.fasta' % line, 'a+') 
    # Do everything else you were going to do 
+0

優秀 - 此作品!我最終將'seqFile = None'放在循環外,然後在循環內添加了'if seqFile:seqfile.close()'。你的方式可能最終效率更高......不知道你爲什麼被拒絕。 – kevbonham

+1

@kevbonham如果有幫助,我很高興。作爲一個側面說明(如果這種情況還沒有出現在你的想法中,但它可能有) - 如果'test.fasta'文件以與該正則表達式不匹配的行開始,那麼你將會要麼將數據寫入一次性文件(以原始版本),要麼從該條件的'else'一側拋出一個未捕獲的NameError異常(在此版本中)。 – rchang

+0

是的,好點。這是一個非常具體的用例,文件確實以該正則表達式開始。然而,我仍然很新,希望學習最佳實踐 - 您將如何處理第一行可能不匹配的情況? – kevbonham

相關問題