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

