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

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:
    # 你的第二次遍历逻辑
    ...

额外优化小提示

  1. skipinitialspace 参数应传入布尔值 True/False,而非字符串 'true',字符串虽会被视为真值,但不符合参数预期类型,建议修正。
  2. 判断空值时,tempLast is not None 比 tempLast != None 更规范。
  3. 尽量用 with 语句打开文件,避免手动关闭时遗漏导致的资源泄漏。

内容的提问来源于stack exchange,提问作者lL. Bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:17:38