繁体   English   中英

如何在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之后不应该阅读。

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

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

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

产量

12 22 -23 13 

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


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

  1. 将输入拆分为以空格分隔的令牌
  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())))

产量

12 22 -23 13 -12 23

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


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

sys.stdin默认情况下被缓冲。 因此, .read(1)可能在内部读取多个字符。 如果我们(可能)是流的唯一使用者,则没关系,因为从我们的末端开始, .read(1)始终一次返回一个字符。

您可以在-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分隔符的重复

也许msvcrt会帮助您

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM