从sys.stdin读取,以RETURN结束用户输入



我正在Py3.6中编写一个带有用户输入的脚本。

在脚本中,用户被要求在shell中输入一个文本部分(可能包含新行)。然后,输入的文本将被保存到Python变量中以供进一步处理。

由于用户输入可能包含换行符,我想我不能使用input(),而是使用sys.stdin.read()(如这里所建议的)。

问题

读取输入很好,但要结束用户输入,用户必须点击Return,然后使用组合键CTRL + d(请参阅此处)。(参见下面的当前程序)

问题

  • 我更希望用户只需点击Return键即可结束对sys.stdin.read的输入(cf预期过程如下)

编辑:对于CTRL + d对当前流程的任何其他简化也表示赞赏

  • 这可行吗?

  • 这里有一些技巧,但我想也许有更好的方法

当前代码

# display text on screen
print("Review this textn" + text)
# user will copy and paste relevant items from text displayed into Terminal
user_input =  sys.stdin.read() 
print ("hit ctrl + d to continue")
# process `user_input`

当前程序

使用下面再现的当前代码,用户必须进行

1) 粘贴文本2) 点击RETURN结束输入3) 点击Ctrl+d移动到下一个文件

预期程序

我想把它简化为:

1) 粘贴文本2) 点击RETURN结束输入并移动到下一个文件

在MacOSX上运行Python 3.5.6,使用终端进行文本输入。非常感谢您的帮助!

根据您在评论中的回复,如果空行终止是可以接受的(即,您的输入文本除了终止输入之外,不能单独包含换行符),那就是引号琐碎:

user_input = ''          # User input we'll be adding to
for line in sys.stdin:   # Iterator loops over readline() for file-like object
if line == 'n':     # Got a line that was just a newline
break            # Break out of the input loop
user_input += line   # Keep adding input to variable

我一直在提到的另一种选择,尽管我真的不喜欢支撑这种方法的假设。您可以读取您的输入并记录每个输入的时间。您可以定义一个时间限制,在该时间限制之后,您可以放心地假设它不是作为单个块复制粘贴的一部分。然后,假设后面的换行符本身就是用户输入的末尾。例如:

import sys
import time
COPY_PASTE_LIMIT = 0.5  # For instance 500ms
# Presuming platform time precision
# greater then whole seconds.
user_input = ''
last = 0  # We'll also later terminate when input was nothing
# but an initial empty line.
for line in sys.stdin:
now = time.time()
if line == 'n' and (now - last > COPY_PASTE_LIMIT or last == 0):
break
last = now
user_input += line
print(user_input)

相关内容

  • 没有找到相关文章

最新更新