我正在Py 3.6中使用用户输入来编写脚本。
在脚本中,要求用户在外壳中输入一个文本部分(可能包含新行)。输入的文本随后将保存到Python变量中以进行进一步处理。
由于用户输入的内容可能包含换行符,因此我认为我不能使用input()
,而是使用sys.stdin.read()
(如建议的here)。
读入输入效果很好,但是要结束,用户必须按下Return键,然后使用组合键CTRL + d
(请参阅here)。 (请参见下面的当前过程)
sys.stdin.read
的输入(参见下面的 Expected Procedure ) 编辑:也欢迎使用CTRL + d
对当前流程进行任何其他简化。
这可行吗?
有些黑客here,但我认为也许有更好的方法
# display text on screen
print("Review this text\n" + 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,使用终端进行文本输入。 任何帮助深表感谢!
答案 0 :(得分:1)
根据您在评论中的答复,如果可以接受以空行终止(即,您的输入文本只能包含换行符以终止输入,但不能终止输入),因此报价微不足道:
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)