You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中csv.reader统计行数后遍历循环失效原因咨询

问题原因与解决方案

嘿,这个问题我太熟悉了!核心原因和Python里迭代器的特性直接相关,咱们来理清楚:

csv.reader()返回的是一个迭代器对象,而不是像列表那样可以反复遍历的容器。迭代器的特点是:它只会在你遍历的时候生成元素,而且一旦遍历完(指针走到末尾),就再也没有元素可以输出了——相当于“耗尽”了。

你代码里的sum(1 for row in sensor)其实已经把这个迭代器从头到尾完整遍历了一遍,把所有行都用来计数了。这时候迭代器内部的指针已经停在了文件的最后一行之后,后面再写for row in sensor的时候,迭代器里已经没有任何剩余的行可以遍历,自然就跳过了循环内的所有逻辑。

给你两种常用的解决办法:

方法1:把迭代器转为列表(适合小文件)

如果你的CSV文件不大,直接把reader的内容转成列表,这样列表可以被多次遍历:

with open(r"C:\Users\heltbork\Desktop\test\ICM.csv", newline='') as csvfile:
    # 把reader转为列表,一次性加载所有行到内存
    sensor_rows = list(csv.reader(csvfile, delimiter=',', quotechar='|'))
    row_count = len(sensor_rows)
    print(row_count)
    # 现在可以正常遍历列表
    for row in sensor_rows:
        # 你的循环逻辑代码

注意:如果是GB级别的超大CSV,这种方法可能会占用过多内存,这时候推荐第二种方法。

方法2:重置文件指针并重新创建reader(适合大文件)

如果文件很大,不想一次性加载到内存,可以在统计行数后,把文件指针移回开头,然后重新创建一个csv.reader对象:

with open(r"C:\Users\heltbork\Desktop\test\ICM.csv", newline='') as csvfile:
    sensor = csv.reader(csvfile, delimiter=',', quotechar='|')
    row_count = sum(1 for row in sensor)
    print(row_count)
    # 将文件指针移回文件开头
    csvfile.seek(0)
    # 重新创建reader对象(因为旧的迭代器已经耗尽)
    sensor = csv.reader(csvfile, delimiter=',', quotechar='|')
    # 现在可以正常遍历
    for row in sensor:
        # 你的循环逻辑代码

简单来说,就是记住:迭代器是“一次性”的,用完就空了——要么提前把内容存成可重复访问的容器,要么重新获取一个新的迭代器~

内容的提问来源于stack exchange,提问作者Preben Enhed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:33:29