如何在输入时读取输入? - Python

时间:2017-03-09 09:02:58

标签: python string validation input

有点新的python(和一般的编程)所以请原谅我,如果这个问题有点基础,但我以前的研究尝试没有产生任何结果。我想知道如何让python验证输入行并使用输入完成任务,因为它被输入。 例如

alphabet = "abcdefghijklmnopqrstuvwxyz"

useralphabet = input("Please enter however much of the alphabet you know:")

while(useralphabet in alphabet):

    break

print("You know", 26 - len(useralphabet), "letters of the alphabet!")

显然我知道这段代码不会按预期工作,但我希望它能证明我想要做的事情,即。让用户输入文本,直到他们输入的文本不再是指定字符串的一部分。

任何帮助将不胜感激

(如前所述,我对此比较陌生,所以非常感谢这些例子)

2 个答案:

答案 0 :(得分:0)

答案取决于您的操作系统(操作系统)。通常,只有在您点击pandas.Series键后,操作系统才会将输入字符串移交给python。如果您需要在键入时执行此操作,则可能需要调用某些依赖于系统的调用来关闭输入缓冲。

有关此内容的更多信息,请参阅Python read a single character from the user

答案 1 :(得分:0)

这是一个工作示例(在 Linux 上使用 Python 3.8.6 测试)。如果您需要针对其他系统进行修改,请参阅 this 答案。

hinput 函数在输入字符时读取字符,并为每个传递新字符和整行的新字符调用 on_char

在我的示例中,当用户键入 x 时,on_char 函数返回 True,这导致 hinput 函数停止等待新输入。

如果用户输入 hello,它会自动补全到 hello, world 并终止 hinput

import sys
import termios
import tty
from typing import Callable

def main():
    hinput("prompt: ", on_char)
    return 0

def on_char(ch: str, line: str) -> bool:
    if ch == 'x':
        sys.stdout.write('\n')
        sys.stdout.flush()
        return True
    if line+ch == 'hello':
        sys.stdout.write("%s, world\n" % ch)
        sys.stdout.flush()
        return True
    return False

def hinput(prompt: str=None, hook: Callable[[str,str], bool]=None) -> str:
    """input with a hook for char-by-char processing."""
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    inpt = ""
    while True:
        sys.stdout.write('\r')
        if prompt is not None:
            sys.stdout.write(prompt)
        sys.stdout.write(inpt)
        sys.stdout.flush()
            
        ch = None
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old)

        if hook is not None and hook(ch, inpt):
            break

        if ord(ch) == 0x7f: #BACKSPACE
            if len(inpt) > 0:
                sys.stdout.write('\b \b')
                inpt = inpt[:-1]
            continue

        if ord(ch) == 0x0d: #ENTER
            sys.stdout.write('\n')
            sys.stdout.flush()
            break

        if ch.isprintable():
            inpt += ch
            
    return inpt

if __name__ == '__main__':
    sys.exit(main())