Python文件读取while循环为何多输出编号5?技术咨询
为什么程序会输出编号5的空行?
咱们一步步拆解你的代码执行流程,就能找到问题根源:
- 程序一开始执行
line = infile.readline(),读取到文件第一行内容,打印出1 Mary had a little lamb,,此时line变量存储的是第一行的非空字符串。 - 初始化
i=2后,进入while line != ""循环——这时候line还是第一行的内容,满足循环条件,进入循环体。 - 循环体里的逻辑是先读取下一行,再打印当前编号+行内容:
- 第二次循环:读取第二行,打印
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;
- 第二次循环:读取第二行,打印
- 重点来了!第四次循环结束后,回到
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
相关产品推荐
相关产品推荐

