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

嵌套在while循环中的Python for循环无法执行求助

问题分析与解决方案

嘿,我一眼就看出问题出在哪啦!你的核心问题是csv.reader返回的是一个迭代器,而迭代器有个关键特性:只能被遍历一次!

你看,代码里第一次的for c, row in enumerate(reader):已经把整个CSV文件的内容都读完了,迭代器内部的指针直接走到了末尾。当你在while循环里再次尝试遍历reader时,它已经没有任何数据可以返回了,所以那个for循环自然就不会执行。

具体修复步骤

1. 先把所有行存入列表复用

在第一次遍历之前,把reader转换成列表保存起来,这样就能重复遍历数据了:

import csv  # 别忘了导入csv模块哦

with open("Nominees_18.csv") as nominees:
    reader = csv.reader(nominees)
    next(reader)  # 跳过表头行
    # 把所有行存入列表,后续可以反复遍历
    rows = list(reader)
    
    # 第一次遍历用保存好的rows列表
    for c, row in enumerate(rows):
        print(row[0], row[1], c)
    
    while True:
        name = input("Choose a number: ")
        print(4)
        # 这里遍历我们提前存好的rows列表,而不是已耗尽的reader
        for c, row in enumerate(rows):
            print(4)
            if str(c) == name:  # 改成精确匹配,避免输入"1"匹配到c=11、21这类情况
                # 修复你的统计逻辑:直接统计row中等于"y"的元素数量
                print(sum(1 for item in row if item == "y"))
        # 修复判断逻辑,原来的写法只会匹配小写"no",用lower()兼容大小写输入
        if input("Choose another? ").lower() == "no":
            break

2. 顺便修正两个小坑

  • 原来的str(c) in name逻辑有问题,会导致输入"1"时意外匹配到c=11、21等序号,改成str(c) == name实现精确匹配更合理。
  • 你的列表推导式len([i for i in row if row[i] == "y"])是错误的:i是row里的元素而非索引,直接遍历元素统计即可,用sum(1 for item in row if item == "y")更高效简洁。
  • input("chose another?") == ("no" or "No")的写法不严谨,("no" or "No")等价于"no",永远只会匹配小写输入,改成.lower() == "no"能兼容大小写的"no"或"No"。

这样修改后,while循环里的for循环就能正常执行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:36:26