如何在 Python 中使用 raw_input() 在某个字符后停止从用户读取输入?

Moh*_*Ali 2 python stdin

如果我使用 raw_input() 它需要所有用户输入。我想在用户输入“-1”时停止输入。

我的意思是如果用户输入'12 22 -23 3 -1 23 -1 23',它不应该在3之后读取。

任何其他读取输入的方式也可以。

jfs*_*jfs 5

... 序列永远不会停止。示例: 1 2 -1 2 -3 -1 34 12 ......................它永远不会停止。但是如果遇到-1,我必须停止阅读。

raw_input() 总是读整行。

如果您不想阅读整行;你可以试试sys.stdin.read(1)

import sys

def read_until_minus_one():
    buf = []
    seen_minus = False
    while True:
        char = sys.stdin.read(1) 
        if not char: # EOF
            break 
        if char == '1' and seen_minus:
            buf.pop() # chop the last minus
            break # seen -1
        else:
            seen_minus = (char == '-')
            buf.append(char)
    return ''.join(buf)

print(read_until_minus_one())
Run Code Online (Sandbox Code Playgroud)

例子

12 22 -23 13 -12 23 -1 23 12
Run Code Online (Sandbox Code Playgroud)

输出

12 22 -23 13 
Run Code Online (Sandbox Code Playgroud)

注意:它-1在读取后立即停止。在这种情况下,后续sys.stdin.read(1)返回'2'


如果您只想在-1遇到以空格分隔的标记(而不是作为数字的一部分-12)时才停止,则输入解析可以分为两个阶段:

  1. 将输入拆分为以空格分隔的标记
  2. 获取令牌直到-1遇到
import sys

def read_until_minus_one():
    buf = []
    seen_minus = False
    while True:
        char = sys.stdin.read(1) 
        if not char: # EOF
            break 
        if char == '1' and seen_minus:
            buf.pop() # chop the last minus
            break # seen -1
        else:
            seen_minus = (char == '-')
            buf.append(char)
    return ''.join(buf)

print(read_until_minus_one())
Run Code Online (Sandbox Code Playgroud)

输出

12 22 -23 13 -12 23 -1 23 12
Run Code Online (Sandbox Code Playgroud)

注意:在这种情况下它读取了更多的内容,因为在这种情况下-1内部无法识别-12


注意:在这种情况下,您不需要curses其他方式从用户那里读取单个字符。仅当输入是交互式的并且您希望在用户按下Enter(或 EOF)之前更快地获取内容时才需要它。

sys.stdin默认情况下是缓冲的。因此.read(1)可以在内部读取多个字符。如果我们是流的唯一消费者(可能),那么没关系,因为从我们的角度来看.read(1),一次总是返回一个字符。