为何该Python代码读取文件时会跳过奇数行(索引0、2、4…)?
为什么这段代码只输出原文件的交替行(偶数索引行)?
嘿,这个问题的核心原因很简单——你在代码里调用了两次readline()方法,每次循环都会悄悄消耗掉文件里的两行内容,其中一行被用来判断循环是否继续,另一行才会被打印出来:
- 首先看
while循环的条件:while kanji_file.readline() != ''。每一次检查循环条件的时候,readline()都会读取当前文件指针指向的那一行(比如第一次读取的是索引0的行),然后把文件指针移动到下一行的开头。如果读取到的内容不是空字符串,就会进入循环体。 - 进入循环体后,你又执行了
print(kanji_file.readline(), end='')——这时候readline()会读取指针当前停留的那一行(也就是索引1的行),然后再次移动指针到下一行。
你提到输出的是偶数索引行,这里大概率是文件末尾的特殊情况导致的:假设你的文件有101行(索引0到100),最后一次循环时:
while条件里读取到索引100的行(非空),进入循环体;- 但再次调用
readline()时,已经到了文件末尾,读取到的是空字符串,所以这次不会打印任何内容。
这样一来,前面的循环里被打印的其实是索引1、3…99的奇数行,但因为最后一行(索引100)没被打印,可能你误以为输出的是偶数索引行?或者你是不是把行的索引计数搞反了?
不管怎样,这段代码的本质就是每次循环读取两行,丢弃一行、打印一行,所以最终输出的是原文件的交替行。
如果想要正确打印所有行,或者精准控制只打印偶数索引行,可以修改代码:
打印所有行的正确写法
kanji_file = open('kanji.txt', 'r', encoding="utf8") current_line = kanji_file.readline() while current_line != '': print(current_line, end='') current_line = kanji_file.readline() kanji_file.close()
或者更Pythonic的写法(推荐用with语句自动关闭文件):
with open('kanji.txt', 'r', encoding="utf8") as kanji_file: for line in kanji_file: print(line, end='')
只打印偶数索引行的写法
with open('kanji.txt', 'r', encoding="utf8") as kanji_file: for idx, line in enumerate(kanji_file): if idx % 2 == 0: print(line, end='')
内容的提问来源于stack exchange,提问作者dokisuru
相关产品推荐
相关产品推荐

