2016-11-13 109 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()