Python读取CSV时第二个for循环未执行,求排查解决
问题根源:CSV Reader 是迭代器,只能遍历一次
你遇到的问题其实是 Python 迭代器的基础特性——csv.reader 返回的对象是迭代器,而迭代器只能被遍历一次。当你第一次执行 for lecline in lecfi: 时,已经把迭代器里的所有元素取完,指针停在了迭代器末尾;第二次再用 for co in lecfi: 遍历,就没有任何元素可以返回,所以循环完全不会执行。
解决方案:两种思路解决遍历耗尽问题
方案1:将CSV内容转为可重复遍历的列表(推荐)
把 lecfi 转换成列表,这样你可以多次遍历这个列表,不会出现迭代器耗尽的问题。同时优化文件操作的安全性,用 with 语句自动管理文件资源:
# 替换原有的lecfi初始化代码 with open(table1, 'r') as f: # 注意:skipinitialspace 是布尔值 True,不是字符串 'true' lecfi = csv.reader(f, skipinitialspace=True, delimiter='\t') lecfi_list = list(lecfi) # 把迭代器转为可重复遍历的列表 # 后续两次遍历都用 lecfi_list 代替 lecfi if oldSize != fileSize: cpt = 0 indLast = 0 fileSize = os.path.getsize(table1) for lecline in lecfi_list: cpt += 1 last = str(lecline) if tempLast is not None and last == tempLast: print "TEMPLAST != NONE", cpt indLast = cpt print "Indice de la derniere ligne : ", indLast print last, tempLast print "Variable indLast : ", indLast i = 0 for co in lecfi_list: print "\nCOOOOOOO : ", co if i == indLast: data.append(co[0]) i += 1
方案2:重新打开文件创建新的Reader
如果你的CSV文件特别大,转成列表会占用过多内存,可以在第二次遍历前重新打开文件并初始化新的 csv.reader 对象:
# 第一次遍历前初始化Reader lecfi = csv.reader(open(table1,'r'), skipinitialspace=True, delimiter='\t') for lecline in lecfi: # 你的第一次遍历逻辑 ... # 第二次遍历前重新初始化Reader lecfi = csv.reader(open(table1,'r'), skipinitialspace=True, delimiter='\t') for co in lecfi: # 你的第二次遍历逻辑 ...
额外优化小提示
skipinitialspace参数应传入布尔值True/False,而非字符串'true',字符串虽会被视为真值,但不符合参数预期类型,建议修正。- 判断空值时,
tempLast is not None比tempLast != None更规范。 - 尽量用
with语句打开文件,避免手动关闭时遗漏导致的资源泄漏。
内容的提问来源于stack exchange,提问作者lL. Bob
相关产品推荐
相关产品推荐

