【问题标题】:Python nested loop doesn't loopPython嵌套循环不循环
【发布时间】:2015-11-16 19:45:52
【问题描述】:

我是一个 python 初学者,我不能让我的循环循环。

情况如下:我有两个 csv 文件(事件日志)。

首先称为 bd8result.csv,其中包含 4 或 5 行结构如下:

2015/10/30 09:53:44,blabla1,259373865,95,F,A1 IP Thers,A1SIP V1 (R),-,,1446195224
2015/10/30 11:03:14,blabla2,259431070,32,F,A7 IP MornOs,A7SIP V1 (R),-,,1446199394
2015/10/30 21:30:59,blabla3,259980991,86,F,A2 IP Hor4ain,A2IP V1 (R),-,,1446237059

第一列是日期,第二列是IP事件(目标),最后一列是纪元时间。

我需要在具有相同结构的更大日志文件中找到 blabla1、blabla2 和 blabla3 以及在这些事件之前和之后 20 分钟关联的事件,并将结果写入 csv 文件。 我只是收集位于同一 lecteur 信息中的事件(if... 中的测试也是如此)。

我的代码如下所示:

with open('result_'+ namefile + '.csv', 'rb') as master1, open('epoch_'+ namefile + '.csv', 'rb') as hosts1:
    reader2 = csv.reader(master1)
    reader1 = csv.reader(hosts1)
    for row in reader2:
        target = row[1]
        lecteur = row[5]
        epoch_ref = int(row[-1])
        for row2 in reader1:
            epoch1 = int(row2[-1])
            lecteur1 = row2[5]
            with open('result_scout' + namefile + '.csv', 'a') as results1:
                 if epoch1 > (epoch_ref - ecart) and epoch1 < (epoch_ref + ecart) and lecteur1 == lecteur:
                    writer1 = csv.writer(results1)
                    writer1.writerow([target]+[sys.argv[1]]+row2)
                    results1.close()

我的问题是它正确执行了第一项 (blabla1),但没有为 blabla2 和 blabla3 编写任何内容。

我已经尝试了几件事,但我被卡住了。

任何帮助表示赞赏。谢谢!

【问题讨论】:

  • Protip:要将文本格式化为代码(保留缩进等),请将其粘贴到编辑框中,选择整个块并按 Ctrl-K 将所有行缩进四个空格。无需乱用反引号或&lt;code&gt; 标签;这些仅适用于短内联代码 sn-ps。

标签: python csv nested-loops


【解决方案1】:

在循环reader2 的一次迭代之后,reader1 被其 for 循环耗尽并引发 StopIteration 并且不会在后续循环中返回任何内容。

您应该在每次迭代中获得一个 csv.reader 的新实例:

with open('result_'+ namefile + '.csv', 'rb') as master1:
    for row in csv.reader(master1):
        target = row[1]
        lecteur = row[5]
        epoch_ref = int(row[-1])
        with open('epoch_'+ namefile + '.csv', 'rb') as hosts1:
            for row2 in csv.reader(hosts1):
                epoch1 = int(row2[-1])
                lecteur1 = row2[5]
                with open('result_scout' + namefile + '.csv', 'a') as results1:
                     if epoch1 > (epoch_ref - ecart) and epoch1 < (epoch_ref + ecart) and lecteur1 == lecteur:
                        writer1 = csv.writer(results1)
                        writer1.writerow([target]+[sys.argv[1]]+row2)
                        results1.close()

来自documentation

csv.reader(csvfile)

返回一个读取器对象,它将遍历给定的行 .csv 文件。 csvfile 可以是任何支持迭代器的对象 协议并在每次调用其 next() 方法时返回一个字符串。

这意味着在读者提出StopIteration 之后,它将像耗尽的发电机一样耗尽。

【讨论】:

  • 谢谢塞巴斯蒂安!!它绝对像这样的魅力!
猜你喜欢
  • 2010-12-21
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 2021-12-30
  • 2020-10-09
  • 2020-01-03
  • 2015-04-16
相关资源
最近更新 更多