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

Python中next()函数抛出StopIteration错误问题求助

解决StopIteration错误并正确提取四月生日

嘿,我明白你为啥头疼了!咱们先来搞清楚这个StopIteration错误到底是咋回事,然后一步步把代码改对。

错误根源:重复调用next()导致迭代越界

你写的for k in a其实已经在自动迭代文件对象a了——每次循环,Python都会帮你调用一次next(a)来获取下一行内容。但你在循环里又手动加了e = next(a),这就相当于一次循环跳着读两行!

比如你的文件有3行内容:

Bob, June 10
Joe, April 12
Sue, July 22

第一次循环:for k in a拿到第一行(Bob那行),然后next(a)拿到第二行(Joe那行),这时候没问题;
第二次循环:for k in a拿到第三行(Sue那行),然后你再调用next(a)——这时候文件已经读完了,没有下一行了,自然就抛出StopIteration错误啦!

另外,你用b[0:5]来判断月份也不靠谱,比如June是4个字母,切片会拿到June (带空格),根本没法正确判断是不是April。

修正后的代码方案

咱们换个思路,让for循环老老实实逐行读,然后正确拆分字符串提取月份:

情况1:文件每行一个生日条目

如果你的文件是每行存一个人的信息,用下面的代码:

# 用with语句打开文件,自动帮你关闭,更安全
with open("c:/Users/me/Documents/fruits.txt", "r") as file:
    # 逐行读取,for循环自动处理迭代,不用手动next()
    for line in file:
        # 去掉每行首尾的空白(换行符、空格之类的)
        cleaned_line = line.strip()
        # 跳过空行(如果有的话)
        if not cleaned_line:
            continue
        # 按逗号+空格拆分姓名和生日,split(1)避免姓名里有逗号的情况
        name, birthday = cleaned_line.split(', ', 1)
        # 拆分生日字符串,取第一个元素就是月份
        month = birthday.split()[0]
        # 判断是不是四月,是的话打印
        if month == 'April':
            print(f"{name}的生日:{birthday}")

情况2:文件所有条目在一行,用分号分隔

如果你的文件内容是一行写到底(比如Bob, June 10;Joe, April 12;Sue, July 22),就调整成这样:

with open("c:/Users/me/Documents/fruits.txt", "r") as file:
    # 读取整个文件内容,去掉首尾空白
    content = file.read().strip()
    # 按中文分号拆分每个条目(如果是英文分号就换成';')
    entries = content.split(';')
    for entry in entries:
        cleaned_entry = entry.strip()
        if not cleaned_entry:
            continue
        name, birthday = cleaned_entry.split(', ', 1)
        month = birthday.split()[0]
        if month == 'April':
            print(f"{name}的生日:{birthday}")

运行效果

不管是哪种情况,运行后都会输出:

Joe的生日:April 12

这样就完全解决你的问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:55:24