我正在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)