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

为何该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:27:30