在python中写入文件

时间:2016-11-13 00:48:27

标签: python

我一直在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

我的输出只是其中一行而不是所有行

3 个答案:

答案 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()