在Python中只接受数字输入

3 投票
2 回答
4360 浏览
提问于 2025-04-16 00:35

有没有办法让Python只接受数字输入,比如像使用raw_input()那样?

我知道我可以获取输入并捕捉ValueError错误,但我想知道有没有什么方法可以强制提示只接受数字,其他输入就不让通过。

2 个回答

0

据我所知,答案是否定的。我从来没有听说过在终端里,使用Python或其他语言可以做到这样的事情。

我能想到的最接近的办法是把终端设置成静默模式(这样输入的字符不会显示出来),再加上无缓冲模式(这样每输入一个字符就能立刻处理,而不是等到输入完一整行)。然后逐个读取输入的字符;如果是数字,就打印出来并添加到一个字符串里,否则就丢掉。不过我也不太确定终端是否允许这样操作。

2

来自文档

如何一次只获取一个按键输入?

对于Unix系统,有几种解决方案。使用curses模块可以很简单地实现这个功能,但curses模块比较大,学习起来有点难。这里有一个不使用curses的解决方案:

import termios, fcntl, sys, os
fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while 1:
        try:
            c = sys.stdin.read(1)
            print "Got character", `c`
        except IOError: pass
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

要让这个代码工作,你需要用到termios和fcntl模块。我只在Linux上试过,但应该在其他地方也能用。在这个代码中,字符是一个一个地读取和打印出来的。

termios.tcsetattr()这个函数可以关闭标准输入的回显功能,并禁用规范模式。fcntl.fnctl()则用来获取标准输入的文件描述符标志,并将其修改为非阻塞模式。因为在标准输入为空时读取会导致IO错误,所以这个错误会被捕获并忽略。

使用这个方法,你可以获取字符,检查它是否是数字,然后再显示出来。不过我自己还没有尝试过。

撰写回答