在python csv.reader中跳过for循环,用于行

时间:2018-04-11 07:14:28

标签: python

我有点好奇,因为当我在代码中添加一行时,它会计算csv文件中的行数,for循环停止工作,只是跳过内部的所有内容。

我的代码如下所示,现在正在运行,但是如果我取消注释row_count它不起作用,那么我的问题是为什么?

for product in products{

    print("Time:",product.time)
    print("Price:",product.price)
}

1 个答案:

答案 0 :(得分:0)

读者是可迭代的(参见iterator protocol):

  

...一个值得注意的例外是尝试多次迭代传递的代码。每次将容器对象(例如列表)传递给iter()函数或在for循环中使用它时,它都会生成一个全新的迭代器。使用迭代器尝试此操作只会返回上一次迭代过程中使用的相同耗尽的迭代器对象,使其看起来像一个空容器。

迭代时会消耗iterable。它不是具体的数据结构:

sensor = csv.reader(...) # creates an iterator

row_count = sum(1 for row in sensor) # *consumes* the iterator

for row in sensor: # nothing in the iterator, consumed by `sum`
    # a lot of stuff here

你应该在迭代时(在for row in sensor:内)进行计数,因为一旦你迭代并使用它 - 你就不能再次迭代了。

备选方案正在使用list来构建数据,或者如果您需要可迭代的界面 - itertools.tee(如果数据没有那么多)。您也可以使用enumerate并保留最后一个索引。

示例:

sensor = csv.reader(...) # creates an iterator

count = 0
for idx, row in enumerate(sensor):
    # a lot of stuff here
    # ...
    count = idx
print(count)

或者:

count = 0
for row in sensor:
    # a lot of stuff here
    # ...
    count += 1
print(count)