我一直在python中收到索引错误。我通过读取文件并只打印所需的输出让我的代码正常工作,但现在我正在尝试将输出写入文件。在尝试编写索引时,我似乎遇到了索引问题。我尝试了几件不同的事情,我试着评论了一下。无论哪种方式,我不断收到索引错误。 编辑原始错误可能是由于eclipse中的错误引起的,但是在服务器上运行时出现了新问题*
我现在可以让它运行并生成输出到.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 :(得分:3)
您一次又一次地覆盖同一个文件。在for循环外打开文件或以追加模式'a'
答案 1 :(得分:1)
我建议你把整个文件写成一个字符串。
with open("blast.txt", 'r') as fileIn:
data = fileIn.read()
然后处理数据。
data = func(data)
然后写入文件。
with open('bast_out.txt','w') as fileOut:
fileOut.write()
答案 2 :(得分:1)
正如@H Doucet所说,将整个事情写成一个字符串,然后使用它。将open()函数保留在循环之外,以便它只打开&关闭文件一次,并确保打开为“追加”。我还清理了你的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()