2017-09-01 40 views
2

嘿有skbio團隊。在skbio中使用TabularMSA打開文件句柄

所以我需要允許DNA或RNA MSA。當我執行以下操作時,如果省略alignment_fh.close(),skbio會讀取except塊中的「非標題」行,這讓我認爲我需要先關閉文件,以便從頭開始,但如果我添加alignment_fh.close()我無法讀取文件。我試圖通過各種方法打開它,但我相信TabularMSA.read()應該允許文件或文件句柄。思考?謝謝!

try: 
    aln = skbio.TabularMSA.read(alignment_fh, constructor=skbio.RNA) 
except: 
    alignment_fh.close() 
    aln = skbio.TabularMSA.read(alignment_fh, constructor=skbio.DNA) 

回答

2

我已經嘗試通過多種方法打開它,但我相信TabularMSA.read()應該允許文件或文件句柄。

您是對的:scikit-bio通常支持使用打開文件句柄或文件路徑讀取和寫入文件。

你正在運行到的問題是,你的第一個電話TabularMSA.read()讀取打開的文件句柄的全部內容,因此當第二TabularMSA.read()呼叫在except塊內擊中,文件指針已經處於結束打開的文件句柄 - 這就是爲什麼你會得到一個錯誤信息,暗示該文件是空的。

此行爲是故意的;當scikit-bio被賦予一個打開的文件句柄時,它將讀取或寫入文件,但不會嘗試管理句柄的文件指針(該類型的管理取決於代碼的調用者)。如果要求scikit-bio讀取文件路徑(即包含磁盤上文件的路徑或可通過某個URI訪問的字符串),scikit-bio將爲您打開和關閉文件句柄,所以這往往是更簡單的方法。

您可以使用文件路徑或文件句柄來實現您的目標。在以下示例中,假設aln_filepathstr,指向磁盤上的對齊文件(例如"/path/to/my/alignment.fasta")。

  • 隨着文件路徑:你可以簡單地傳遞文件路徑都TabularMSA.read()電話;沒有open()close()電話是必要的你的一部分。

    try: 
        aln = skbio.TabularMSA.read(aln_filepath, constructor=skbio.RNA) 
    except ValueError: 
        aln = skbio.TabularMSA.read(aln_filepath, constructor=skbio.DNA) 
    
  • 隨着文件句柄:你需要打開一個文件句柄和讀取第二時間之前重置except塊內的文件指針。

    with open(aln_filepath, 'r') as aln_filehandle: 
        try: 
         aln = skbio.TabularMSA.read(aln_filehandle, constructor=skbio.RNA) 
        except ValueError: 
         aln_filehandle.seek(0) # reset file pointer to beginning of file 
         aln = skbio.TabularMSA.read(aln_filehandle, constructor=skbio.DNA) 
    

注:在這兩個例子中,我使用except ValueError,而不是一個 「包羅萬象」 except聲明。我建議捕獲特定的錯誤類型(例如ValueError)而不是任何異常,因爲代碼的失敗方式可能與您期望的不同。例如,對於「全面通過」except聲明,用戶將無法使用Ctrl-C中斷程序,因爲KeyboardInterrupt將被捕獲並被忽略。

+0

這聽起來像是一個關於'StringIO'的單獨問題,並不一定與scikit-bio相關。你能用最小的代碼示例發佈一個新問題來重現問題嗎? – jairideout

+0

我很可能在您發佈的同時刪除了我的評論,對不起。我想通了,文件句柄的例子是完美的。我感到困惑,因爲我的單元測試和文件的行爲有所不同。謝謝! – JTFouquier

相關問題