如何使用for循环从.txt表中提取数据

时间:2018-02-21 11:53:06

标签: python-3.x list for-loop

我想打开Learn_full_data.txt从中提取一些行,并使用foor循环将它们写在名为All_Data.txt的新文件上。

Learn_full_data.txt表:

vp  run trial   img_order   mimg    perc_aha_norm   perc_gen_norm   moon_onset  moon_pulse  moon_pulse_time answer_time answer_pulse    answer_pulse_time   fix_time    fix_pulse   fixpulse_time   flash_onset flash_pulse flash_pulse_time_(flash_onset)  tar_time_(greyscale)    tar_pulse   tarpulse_time   answer  RT_answer   aha RT_aha  condition solved_testphase  RT_solvedtest   oldnew  RT_oldnew   remknow RT_remknow
1   1   1   70  mimg433 0,4375  0,5625  18066   6   20029   20083   7   22029   22099   8   24029   24116   8   24029   24633   10  28029   nicht_erkannt   1055    Aha 1145    exp 0   0   old 2030    know    381
1   1   2   146 mimg665 0,6 0,4 30666   12  32029   32683   13  34029   34699   16  40028   40716   16  40028   41233   18  44028   erkannt 990 keinAha 1240    exp 1   2758    old 634 rem 1063
2   1   1   130 mimg640 0,666667    1   17366   5   19328   19383   6   21328   21399   8   25328   25416   8   25328   25933   10  29328   erkannt 871 keinAha 2121    base    1   2891    old 3105    know    533
2   1   2   83  mimg500 0,454545    0,272727    33966   13  35328   35983   14  37328   37999   15  39328   40016   15  39328   40533   17  43328   nicht_erkannt   1031    Aha 1153    exp 0   0   new 2358    kA  2358

行Vp有两个主题,所以我创建了一个列表,其中包含来自行Vp的主题(还有更多,但我刚刚粘贴了一段摘录):

list = ['1','2']

现在我想用这段代码迭代列表(如果列表中的项与Vp相同,则在All_Data.txt上写一些来自Learn_full_data.txt的行):

Learn = open('Learn_full_data.txt','r')

file = open('All_Data.txt','w')

file.write('Vp\tImg\tDescription\tPerc_gen_norm\tPerc_aha_norm\tCond\tGen\tRt_Gen\tRt_Solved\tInsight\tRt_Insight\tOldNew\tRt_OldNew\tRemKnow\tRt_RemKnow\n')

for i in list:
    for splitted in Learn:
        splitted = splitted.split()
        Vp = splitted[0]
        Img = str(splitted[4])
        Perc_gen_norm = splitted[6]
        Perc_aha_norm = splitted[5]
        Cond = splitted[26]
        Gen = splitted[22]
        Rt_Gen = splitted[23]
        Insight = splitted[24]
        Rt_Insight = splitted[25]
        Rt_Solved = splitted[28]
        OldNew = splitted[29]
        Rt_OldNew = splitted[30]
        RemKnow = splitted[31]
        Rt_Remknow = splitted[32]
        if i == str(Vp):
            file.write(str(Vp)+'\t'+str(Img)+'\t'+'Description'+'\t'+str(Perc_gen_norm)+'\t'+str(Perc_aha_norm)+'\t'+str(Cond)+'\t'+str(Gen)+'\t'+str(Rt_Gen)+'\t'+str(Insight)+'\t'+str(Rt_Insight)+'\t'+str(Rt_Solved)+'\t'+str(OldNew)+'\t'+str(Rt_OldNew)+'\t'+str(RemKnow)+'\t'+str(Rt_Remknow)+'\n’)

代码输出只是列表中的第一次迭代。我期待它继续迭代:

Vp  Img Description Perc_gen_norm   Perc_aha_norm   Cond    Gen Rt_Gen  Rt_Solved   Insight Rt_Insight  OldNew  Rt_OldNew   RemKnow Rt_RemKnow
1   mimg433 Description 0,5625  0,4375  exp nicht_erkannt   1055    Aha 1145    0   old 2030    know    381
1   mimg665 Description 0,4 0,6 exp erkannt 990 keinAha 1240    2758    old 634 rem 1063

列表中指定的第二次迭代不会发生。列表的第二项是'2',Vp项也是'2',所以第二次迭代应该返回与Vp'1'相同的Vp'2'。为什么for循环在Vp'1'停止?

1 个答案:

答案 0 :(得分:0)

问题是你在for i in list循环的第一次迭代中遍历代码中的所有行。在第二次迭代中,例如i = 2,读取光标仍在文件末尾。您必须在每次迭代中将其设置为第一行。这可以通过Learn.seek(0)

完成
for i in list:
    Learn.seek(0)
    for splitted in Learn:
        splitted = splitted.split('\t')
        Vp = splitted[0]
        Img = str(splitted[4])
        Perc_gen_norm = splitted[6]
        Perc_aha_norm = splitted[5]
        Cond = splitted[26]
        Gen = splitted[22]
        Rt_Gen = splitted[23]
        Insight = splitted[24]
        Rt_Insight = splitted[25]
        Rt_Solved = splitted[28]
        OldNew = splitted[29]
        Rt_OldNew = splitted[30]
        RemKnow = splitted[31]
        Rt_Remknow = splitted[32]
        if i == str(Vp):
            file.write(str(Vp)+'\t'+str(Img)+'\t'+'Description'+'\t'+str(Perc_gen_norm)+'\t'+str(Perc_aha_norm)+'\t'+str(Cond)+'\t'+str(Gen)+'\t'+str(Rt_Gen)+'\t'+str(Insight)+'\t'+str(Rt_Insight)+'\t'+str(Rt_Solved)+'\t'+str(OldNew)+'\t'+str(Rt_OldNew)+'\t'+str(RemKnow)+'\t'+str(Rt_Remknow))