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

How to stop reading input from user after a certain char using raw_input() in Python?

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

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

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

也许 msvcrt 可以帮到你

import msvcrt
print 'Press a to continue:\n'
inPchar = msvcrt.getch()
if inPchar.upper() == 'A': 
   print 'Pressed A'

您可以在-1 处拆分字符串。它将创建一个列表,您只使用列表的第一个元素:

full_input = raw_input('Enter sequence:')
user_input = full_input.split('-1')
print user_input[0].strip()

输出:

macbook:Downloads joeyoung$ python splitinput.py 
Enter sequence:1 2 -1 2 -3 -1 34 12
1 2

编辑: 我修改了上面的解决方案以处理 -1 分隔符的重复

... The sequence never stops. Example: 1 2 -1 2 -3 -1 34 12 ...................... it never stops. But I have to stop reading if I encounter -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())

Example

12 22 -23 13 -12 23 -1 23 12

输出

12 22 -23 13 

注意:一读到-1就停止了。在这种情况下,随后的sys.stdin.read(1) returns '2'


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

  1. 将输入拆分为 space 分隔的标记
  2. 获取令牌直到遇到-1
#!/usr/bin/env python
import sys
from functools import partial
from itertools import takewhile

def get_tokens(stream=sys.stdin):
    token = []
    for char in iter(partial(stream.read, 1), ''):
        if char.isspace(): # use any space as a separator
            if token:
                yield ''.join(token)
                del token[:]
        else:
            token.append(char)
    if token:
        yield ''.join(token)

print(' '.join(takewhile(lambda s: s != '-1', get_tokens())))

Output

12 22 -23 13 -12 23

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


注意:您不需要 cursesother means of reading a single character from the user in this case。仅当输入是交互式的并且您希望在用户按下 Enter(或 E​​OF)之前获取内容时才需要它。

sys.stdin 默认缓冲。因此 .read(1) 可能会在内部读取多个字符。如果我们是流的唯一消费者(可能)那么这并不重要,因为从我们的角度来看 .read(1) 总是 returns 一次一个字符。