Python使用next()读文件报StopIteration错误的解决方法
错误原因
StopIteration是迭代器遍历到末尾、没有更多可返回内容时抛出的异常,你在第一次调用next(inputfile)时就触发这个错误,核心原因只有一个:你代码打开的bendin.txt文件对象里没有任何可读内容。
常见触发场景:
- 你存放测试用例的
bendin.txt和代码运行时的工作目录不匹配,代码实际打开的是另一个位置的空同名文件——注意Python用相对路径打开文件时,是相对于运行代码时的终端工作目录,不是相对于代码文件本身的存放目录 - 你在进入
with块之前,已经对inputfile做过读操作(比如调试时加过read()类的代码没删掉),文件指针已经被移到了文件末尾,后续next自然读不到内容 - 你编辑完测试输入文件后没有保存,磁盘上的
bendin.txt还是空文件
另外你当前的文件打开写法不规范:先手动open再把文件对象传入with块,容易出现文件句柄泄漏、指针位置异常的问题,输出文件outputfile也没有被上下文管理器托管,写完内容可能因为没正常关闭导致数据丢失。
排查&修复方案
- 先确认文件路径是否正确,在with块第一行加如下代码,打印当前打开文件的绝对路径和全部内容,定位到实际打开的文件:
import os print("当前打开的文件路径:", os.path.abspath(inputfile.name)) print("文件全部内容:", repr(inputfile.read())) inputfile.seek(0) # 读完所有内容后把指针重置回文件开头,不影响后续读行
如果打印出来的内容是空的,顺着打印的路径找到对应文件,把测试用例写进去保存,或者直接在open时传入测试文件的绝对路径即可。
- 改用规范的上下文管理器写法,把open操作直接放在with行,由上下文管理器自动处理两个文件的打开、关闭逻辑,修正后的完整文件读取代码如下:
import cmath as m # 同时托管输入、输出两个文件的生命周期,自动关闭释放资源 with open("bendin.txt", "r", encoding="utf-8") as inputfile, open("bendout.txt", "w", encoding="utf-8") as outputfile: R1 = next(inputfile).strip().split() R1x1BL = int(R1[0]) R1y1BL = int(R1[1]) R1x2TR = int(R1[2]) R1y2TR = int(R1[3]) R2 = next(inputfile).strip().split() R2x1BL = int(R2[0]) R2y1BL = int(R2[1]) R2x2TR = int(R2[2]) R2y2TR = int(R2[3]) # 后续补充矩形重叠面积计算逻辑即可
补充说明:给open加上encoding="utf-8"参数是为了避免不同系统默认编码不一致导致的读文件乱码问题,读行时加strip()是为了去掉每行首尾的换行符、空格,避免split时出现空字符串的异常。
内容的提问来源于stack exchange,提问作者Akkirotru
相关产品推荐
相关产品推荐

