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

时间:2015-02-28 10:32:09

标签: python stdin

如果我使用raw_input(),则需要所有用户输入。我想在用户输入'-1'时停止输入。

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

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

3 个答案:

答案 0 :(得分:4)

  

......序列永不停止。示例: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())

Example

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

输出

12 22 -23 13 

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


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

  1. 将输入拆分为以空格分隔的标记
  2. 获取令牌,直到遇到-1
  3. #!/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
    

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


    注意:您不需要cursesother means of reading a single character from the user in this case。如果输入是交互式的,并且您希望比用户按 Enter (或EOF)更快地获取内容,则只需要它。

    默认情况下,

    sys.stdin是缓冲的。因此.read(1)可能会在内部读取多个字符。如果我们是流的唯一消费者(可能)那么它无关紧要,因为从我们的结尾.read(1)总是一次返回一个字符。

答案 1 :(得分:0)

您可以将字符串拆分为-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分隔符的重复

答案 2 :(得分:-1)

也许msvcrt会帮助你

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