如何在 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 之后读取。
任何其他读取输入的方式也可以。
也许 msvcrt 可以帮到你
import msvcrt
print 'Press a to continue:\n'
inPchar = msvcrt.getch()
if inPchar.upper() == 'A':
print 'Pressed A'
您可以在-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 分隔符的重复
... The sequence never stops. Example: 1 2 -1 2 -3 -1 34 12 ...................... it never stops. But I have to stop reading if I encounter -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)
returns '2'
。
如果您只想在遇到 -1
作为 space 分隔的标记时停止(而不是像 -12
中那样作为数字的一部分),那么输入解析可以分为两个阶段:
- 将输入拆分为 space 分隔的标记
- 获取令牌直到遇到
-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
。
注意:您不需要 curses
或 other means of reading a single character from the user in this case。仅当输入是交互式的并且您希望在用户按下 Enter(或 EOF)之前获取内容时才需要它。
sys.stdin
默认缓冲。因此 .read(1)
可能会在内部读取多个字符。如果我们是流的唯一消费者(可能)那么这并不重要,因为从我们的角度来看 .read(1)
总是 returns 一次一个字符。
如果我使用 raw_input(),它会接受所有用户输入。我想在用户输入“-1”时停止输入。
我的意思是,如果用户输入“12 22 -23 3 -1 23 -1 23”,则不应在 3 之后读取。
任何其他读取输入的方式也可以。
也许 msvcrt 可以帮到你
import msvcrt
print 'Press a to continue:\n'
inPchar = msvcrt.getch()
if inPchar.upper() == 'A':
print 'Pressed A'
您可以在-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 分隔符的重复
... The sequence never stops. Example: 1 2 -1 2 -3 -1 34 12 ...................... it never stops. But I have to stop reading if I encounter -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)
returns '2'
。
如果您只想在遇到 -1
作为 space 分隔的标记时停止(而不是像 -12
中那样作为数字的一部分),那么输入解析可以分为两个阶段:
- 将输入拆分为 space 分隔的标记
- 获取令牌直到遇到
-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
。
注意:您不需要 curses
或 other means of reading a single character from the user in this case。仅当输入是交互式的并且您希望在用户按下 Enter(或 EOF)之前获取内容时才需要它。
sys.stdin
默认缓冲。因此 .read(1)
可能会在内部读取多个字符。如果我们是流的唯一消费者(可能)那么这并不重要,因为从我们的角度来看 .read(1)
总是 returns 一次一个字符。