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

Reading from sys.stdin, ending user input with RETURN

我正在使用 Py 3.6 中的用户输入编写脚本。

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

由于用户输入可能包含换行符,我想我不能使用 input() 但我正在使用 sys.stdin.read() (as suggested here)。

问题

读取输入工作正常,但要结束用户输入,用户必须按Return然后使用组合键CTRL + d (参见 here)。 (请参阅下面的当前程序

问题

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

当前代码

    # 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 结束输入并移至下一个文件

运行 Python MacOSX 上的 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)