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

时间:2019-01-10 16:39:46

标签: python user-input stdin sys

我正在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,使用终端进行文本输入。 任何帮助深表感谢!

1 个答案:

答案 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)