读入文件,拆分然后写出所需的输出

时间:2016-11-12 22:30:56

标签: python

我是python的新手,遇到一些我似乎无法找到答案的问题。 我有一个大文件,我试图读,然后拆分并写出具体信息。我在读取和拆分方面遇到了麻烦,它只是一遍又一遍地打印相同的东西。

blast_output = open("blast.txt").read()
for line in blast_output:
    subFields = [item.split('|') for item in blast_output.split()]
    print(str(subFields[0][0]) + "\t" + str(subFields[0][1]) + "\t" + str(subFields[1][3]) + "\t" + str(subFields[2][0]))

我的输入文件有很多行,如下所示:

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

我收到的输出是:

c0_g1_i1    m.1 Q9HGP0.1    100.00
c0_g1_i1    m.1 Q9HGP0.1    100.00
c0_g1_i1    m.1 Q9HGP0.1    100.00
c0_g1_i1    m.1 Q9HGP0.1    100.00

但我想要的是

c0_g1_i1      m.1    Q9HGP0.1    100.0
c1002_g1_i1   m.801  Q10302.1    100.0
c1003_g1_i1   m.803  Q6BDR8.1    100.0
c1004_g1_i1   m.804  O94325.1    100.0

2 个答案:

答案 0 :(得分:1)

好问题。您正在使用此行一遍又一遍地使用相同的输入

subFields = [item.split('|') for item in blast_output.split()]

python 2.x版本如下所示:

blast_output = open("blast.txt").read()
for line in blast_output:
    subFields = [item.split('|') for item in line.split()]
    print(str(subFields[0][0]) + "\t" + str(subFields[0][1]) + "\t" + str(subFields[1][3]) + "\t" + str(subFields[2][0]))

请参阅Moses Koledoye的Python 3.x格式化好的版本

答案 1 :(得分:1)

您不需要调用文件对象的read方法,只需逐行迭代即可。然后在for循环中将blast_output替换为line,以避免在所有迭代中重复相同的操作:

with open("blast.txt") as blast_output:
    for line in blast_output:
        subFields = [item.split('|') for item in line.split()]
        print("{:15}{:10}{:10}{:10}".format(subFields[0][0], subFields[0][1], 
                                            subFields[0][1], subFields[1][3], subFields[2][0]))

我使用with在上下文中打开文件,因此Python会自动完成关闭。我还使用字符串格式来构建最终的字符串。

c0_g1_i1       m.1       m.1       Q9HGP0.1  
c1002_g1_i1    m.801     m.801     Q10302.1  
c1003_g1_i1    m.803     m.803     Q6BDR8.1  
c1004_g1_i1    m.804     m.804     O94325.1