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
相关产品推荐
相关产品推荐

