【问题标题】:How to stop reading input from user after a certain char using raw_input() in Python?如何在 Python 中使用 raw_input() 在某个字符后停止从用户读取输入?
【发布时间】:2015-02-28 10:32:09
【问题描述】:

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

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

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

【问题讨论】:

标签: python stdin


【解决方案1】:

...序列永远不会停止。示例: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 之前获取令牌
#!/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(或 EOF)之前获得内容时才需要它。

sys.stdin 默认被缓冲。因此.read(1) 可能在内部读取多个字符。如果我们是流的唯一消费者(很可能),那没关系,因为从我们的末尾.read(1) 总是一次返回一个字符。

【讨论】:

    【解决方案2】:

    也许 msvcrt 会帮助你

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

    【讨论】:

    • 这将使用户无法添加任何包含 a 的单词。
    • @san 当然,但“A”只是一个例子,他想在用户输入内容后停止读取输入。因此他可以将“A”更改为 100% 不会出现在此输入中的任何其他符号,这将解决此问题。
    • 即使这样它也不是完美的解决方案,因为用户最终可能会输入任何类型的输入,而且 msvcrt 既不适用于所有平台,也可能用户已经在 Windows 上拥有它,除非它是标准库的一部分.
    【解决方案3】:

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

    【讨论】:

    • 我已经尝试过了,但是如果序列永远不会停止会发生什么。示例:1 2 -1 2 -3 -1 34 12 ............它永远不会停止。但是如果遇到-1,我必须停止阅读。
    • @malee 我修改了我的答案以处理重复的 -1 分隔符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多