【问题标题】:How to extract data from .txt table with a for loop如何使用 for 循环从 .txt 表中提取数据
【发布时间】:2018-02-21 11:53:06
【问题描述】:

我想打开 Learn_full_data.txt 从中提取一些行,然后使用 foo 循环将它们写入一个名为 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 '2' 的返回值应该与对 Vp '1' 的返回值相同。为什么 for 循环在 Vp '1' 处停止?

【问题讨论】:

  • 看起来像一个 csv 文件。您是否尝试将其加载为 csv 文件?
  • @ArpitSolanki 确实如此。我会编辑帖子。
  • 你看过Python标准包docs.python.org/3/library/csv.html
  • 我去看看,谢谢@MosteM

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


【解决方案1】:

问题是您在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))

【讨论】:

  • 我尝试将 .seek() 方法添加到脚本中,并且输出符合预期。谢谢@MosteM。
  • 显然,在我达到 15 个声望点之前,我不允许对问题进行投票。我会记住它,当我到达它时,我会回到这里来支持你的答案。不过,我已经接受了答案。干杯! @MosteM
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多