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
相关产品推荐
相关产品推荐

