2016-11-13 146 views
2

我一直在Python中收到索引錯誤。我通過讀取文件並簡單地打印所需的輸出,使我的代碼正常工作,但現在我正在嘗試將輸出寫入文件。在編寫代碼時,我似乎遇到索引問題。我嘗試了一些不同的事情,我留下了一個嘗試評論。無論哪種方式,我不斷收到索引錯誤。 編輯原始錯誤可能是由錯誤的日食引起的,但在服務器上運行時,有一個新的問題*在Python中寫入文件

現在我可以得到它的運行併產生輸出到一個txt文件,但它只能打印單個輸出

with open("blast.txt") as blast_output: 
for line in blast_output: 
    subFields = [item.split('|') for item in line.split()] 
    #transId = str(subFields[0][0]) 
    #iso = str(subFields[0][1]) 
    #sp = str(subFields[1][3]) 
    #identity = str(subFields[2][0]) 
    out = open("parsed_blast.txt", "w") 
    #out.write(transId + "\t" + iso + "\t" + sp + "\t" + identity) 
    out.write((str(subFields[0][0]) + "\t" + str(subFields[0][1]) + "\t" + str(subFields[1][3]) + "\t" + str(subFields[2][0]))) 
    out.close() 


IndexError: list index out of range 

輸入文件的樣子:

c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754 
c1002_g1_i1|m.801  gi|1723464|sp|Q10302.1|YD49_SCHPO  100.00 646  0  0  1  646  1  646  0.0  1310 
c1003_g1_i1|m.803  gi|74631197|sp|Q6BDR8.1|NSE4_SCHPO  100.00 246  0  0  1  246  1  246  1e-179 502 
c1004_g1_i1|m.804  gi|74676184|sp|O94325.1|PEX5_SCHPO  100.00 598  0  0  1  598  1  598  0.0  1227 
c1005_g1_i1|m.805  gi|9910811|sp|O42832.2|SPB1_SCHPO  100.00 802  0  0  1  802  1  802  0.0  1644 
c1006_g1_i1|m.806  gi|74627042|sp|O94631.1|MRM1_SCHPO  100.00 255  0  0  1  255  47  301  0.0  525 

預計輸出

c0_g1_i1 m.1 Q9HGP0.1 100.00 
c1002_g1_i1 m.801 Q10302.1 100.00 
c1003_g1_i1 m.803 Q6BDR8.1 100.00 
c1004_g1_i1 m.804 O94325.1 100.00 
c1005_g1_i1 m.805 O42832.2 100.00 
c1006_g1_i1 m.806 O94631.1 100.00 

我的輸出而不是隻有線路,而不是所有行

+0

您需要包含輸入文件的示例 –

+0

首先檢查子字段的形狀。你會發現你爲什麼會得到這個錯誤。 –

+0

寫這個文件不是問題,而是寫入你的'subfields'變量; IndexError意味着你的一個索引根本不存在,它遷移爲'subFields [1] [3]'或'subFields [2] [0]'。你應該猜到它與你的評論嘗試,python總是表明錯誤的確切線 – jadsq

回答

3

您一次又一次覆蓋同一文件。打開for循環之外的文件或以追加模式打開文件'a'

1

的,我建議你寫整個文件到一個字符串中的一個。

with open("blast.txt", 'r') as fileIn: 
     data = fileIn.read() 

然後處理數據。

data = func(data) 

然後寫出文件。

with open('bast_out.txt','w') as fileOut: 
     fileOut.write() 
1

正如@H Doucet所說,把整個東西寫成一個字符串,然後使用它。讓open()函數離開循環,只打開&關閉文件一次,並確保以「append」打開。我也清理了你的out.write()函數。不需要將這些列表項目指定爲字符串,它們已經是。並在每行的末尾添加一個換行符(「\ n」)。

with open("blast.txt") as f: 
    blast_output = f.read() 

out = open("parsed_blast.txt", "a") 
for line in blast_output.split("\n"): 
    subFields = [item.split('|') for item in line.split()] 
    out.write("{}\t{}\t{}\t{}\n".format(subFields[0][0], subFields[0][1], 
             subFields[1][3], subFields[2][0])) 

out.close()