为何Codechef的Python3.6编译器反复报EOF错误,同代码在PyCharm运行正常
EOFError问题解答
什么是EOF错误
EOF是*End of File(文件末尾)*的缩写,EOFError是Python的内置异常,当程序调用input()函数读取标准输入时,输入流已经没有更多内容可以读取,就会触发该异常。
本地PyCharm运行时你可以手动逐行输入内容,不存在输入流提前结束的情况,所以不会触发该错误;Codechef这类编程比赛平台会一次性将所有测试用例的输入作为固定长度的流传给程序,只要程序读取输入的次数超过输入实际的行数,就会抛出EOFError。
本次代码触发错误的具体原因
你的代码存在以下几个问题,均可能触发该错误:
- 变量拼写错误:循环逻辑中你写的是
for l in range(N[I]),这里用到的是大写的I,但外层循环的计数变量是小写的i,大写I属于未定义变量,会直接抛出NameError导致程序提前终止。程序提前终止后没有读完所有输入,部分平台的校验机制会将该类错误归类为EOF类输入错误,也可能因为变量错误导致输入读取次数异常,多调用了input()函数触发EOF错误。 - 输入读取逻辑和题目要求不匹配:你的代码中每组测试用例会读取2行内容,第一行是两个整数
N和K,第二行是N个整数,如果题目实际的输入格式和该逻辑不一致,比如每组测试用例只有1行输入,或者总测试用例数和你读取的T值不匹配,就会导致你多调用input()触发EOF错误。 - 异常捕获范围过窄:你只捕获了
EOFError,其他运行时错误比如ValueError(某行输入的整数数量和预期不符)会直接抛出,平台的错误提示可能存在归类偏差,让你误以为是EOF错误。
修复方案
- 修正变量拼写错误,将
N[I]改为N[i]。 - 确认题目给出的输入格式,保证
input()调用次数和输入实际行数完全一致。 - 建议改用一次性读取所有输入的方式规避逐行读取的EOF问题,参考代码如下:
import sys def main(): data = list(map(int, sys.stdin.read().split())) ptr = 0 T = data[ptr] ptr += 1 res = [] for _ in range(T): N, K = data[ptr], data[ptr+1] ptr += 2 S = data[ptr:ptr+N] ptr += N S.sort(reverse=True) threshold = S[K-1] count = 0 for num in S: if num >= threshold: count +=1 res.append(str(count)) print(' '.join(res)) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Bibek Ray
相关产品推荐
相关产品推荐

