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

Python从sys.stdin读取时负索引异常:无法正确获取最后一个字符

Python负索引奇怪问题的解决办法

哈哈,这个坑我踩过!你遇到的问题根源其实很简单——从sys.stdin读取的每一行末尾都藏着一个换行符(\n),就是它在捣乱!

咱们来拆解下你的代码行为:

  • 当你输入123并按下回车时,程序实际读取到的line内容是'123\n'
  • 取line[-1]时,拿到的就是末尾的\n,打印这个字符的时候只会显示一个空行,看起来就像空字符串
  • 而line[:-1]是截取到倒数第二个字符,刚好把\n切掉了,所以显示出来就是你输入的123

给你几个简单的解决办法:

方法1:读取后去掉末尾的换行符

这是最精准的方式,只去掉换行符,保留其他可能的末尾空格:

import sys
print('Starting loop')
for line in sys.stdin:
    # 移除末尾的换行符
    line = line.rstrip('\n')
    last = line[-1]
    print('last = ' + last)
    allButLast = line[:-1]
    print('AllButLast = ' + allButLast)

方法2:移除所有末尾空白字符

如果你的输入行末尾不会有需要保留的空格/制表符,可以用这个更简洁的写法:

import sys
print('Starting loop')
for line in sys.stdin:
    line = line.rstrip()  # 默认移除所有末尾空白(换行、空格、制表符等)
    last = line[-1]
    print('last = ' + last)
    allButLast = line[:-1]
    print('AllButLast = ' + allButLast)

方法3:一次性读取所有行并自动去掉换行符

这种方式会把所有输入行读到一个列表里,每一行都不带换行符:

import sys
print('Starting loop')
for line in sys.stdin.read().splitlines():
    last = line[-1]
    print('last = ' + last)
    allButLast = line[:-1]
    print('AllButLast = ' + allButLast)

测试一下修改后的代码,输入123的话,输出就会变成:

Starting loop
123
last = 3
AllButLast = 12

内容的提问来源于stack exchange,提问作者ilmix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:55