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

Python文件读取while循环为何多输出编号5?技术咨询

为什么程序会输出编号5的空行?

咱们一步步拆解你的代码执行流程,就能找到问题根源:

  1. 程序一开始执行line = infile.readline(),读取到文件第一行内容,打印出1 Mary had a little lamb,,此时line变量存储的是第一行的非空字符串。
  2. 初始化i=2后,进入while line != ""循环——这时候line还是第一行的内容,满足循环条件,进入循环体。
  3. 循环体里的逻辑是先读取下一行,再打印当前编号+行内容:
    • 第二次循环:读取第二行,打印2 whose fleece was white as snow.,i变成3;
    • 第三次循环:读取第三行,打印3 And everyWhere that Mary went,,i变成4;
    • 第四次循环:读取第四行,打印4 The Lamb was sure to go,i变成5;
  4. 重点来了!第四次循环结束后,回到while条件判断——此时line是第四行的非空内容,条件成立,再次进入循环体:
    • 执行line = infile.readline(),这时候文件已经读到末尾,readline()返回空字符串"";
    • 接着执行print(str(i)+" "+line, end=""),也就是打印5 加上空字符串,最终输出5 这一行(看起来是空行但带有编号5);
    • i自增为6后,下一次循环判断line != ""时,line是空字符串,条件不满足,循环才终止。

简单说,你的循环逻辑是先判断当前line是否为空,再去读取下一行并打印,这就导致最后一次读取到空字符串时,依然会执行打印操作,从而多出了编号5的行。

修正方案

你可以调整循环逻辑,把读取和空值判断放在最前面,避免多余的打印:

infile = open("inputex1.txt","r")
i = 1
while True:
    line = infile.readline()
    # 读取到空行就直接退出循环
    if line == "":
        break
    print(f"{i} {line}", end="")
    i += 1
infile.close()

或者用更Pythonic的写法,直接遍历文件对象(还能自动处理文件关闭):

with open("inputex1.txt","r") as infile:
    # enumerate从1开始编号
    for i, line in enumerate(infile, 1):
        print(f"{i} {line}", end="")

内容的提问来源于stack exchange,提问作者Hamad Al-Tulyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:27:27