在 Python 3 中将 Ctrl-D 与 sys.stdin.readlines() 结合使用后,如何避免 input() 出现 EOFError?

How can I avoid an EOFError for input() after using Ctrl-D with sys.stdin.readlines() in Python 3?

我完全是个新手,正在努力自学 Python 以促进个人成长和发展。所以请对我放轻松。 (如果有任何生物学问题,我很乐意return帮个忙!)

我正在尝试在 MacOSX (10.14.2 Mojave) 的 PyCharm CE 中编写一个程序来执行以下操作:

1) 让用户通过 copying/pasting 从源中一次输入多行文本块。例如:

玛丽和贝丝

去了

公园.

2) 将所有行合并为一行,将\n替换为空格,如下:

玛丽和贝丝去了公园。

我看了很多书,发现让用户一次输入多行文本的首选方法是使用 sys.stdin.readlines(),确保用户使用 Control-D 调用文件结尾。到目前为止,我已经想出了以下内容

import sys


print('''What is the text that you would like to enter?
         (press command-d at the end)\n''')

orig_text = sys.stdin.readlines()
one_string = "".join(orig_text)
one_string = one_string.replace('\n','')
print(one_string)

到目前为止,一切顺利 - one_string 打印出 "Mary and Beth went to the park."

问题出在代码的更下方,当我使用常规的 input() 函数时...

search_word = input('Which word would you like to replace?')
print(search_word)

我收到以下错误信息:EOFError: EOF when reading a line

我看到其他人的帖子也有类似的问题,一些答案建议我试试...

sys.stdin.close()
sys.stdin = open('/dev/tty')
search_word = input('Which word would you like to replace?')
print(search_word)

我试过了,但现在我收到以下错误:OSError:[Errno 6] 设备未配置:'/dev/tty'。 我也试过sys.stdin.flush(),没用

至此,我放弃了,决定请教专业人士: a) 是否有更好的方法让用户将多行文本复制并粘贴到程序中; b) 如果到目前为止我的方法没问题,我怎样才能在不破坏我的计算机的情况下摆脱 OSError?

提前致谢! 马里亚诺

sys.stdin.readline() 不是一个好的解决方案。

您可以使用 fileinput 模块:

import fileinput

for line in fileinput.input():
    ... code ...

fileinput 将遍历指定为命令行参数中给出的文件名的输入中的所有行,如果没有提供参数,则为标准输入。

您的代码可以替换为

one_string = "".join(map(str.rstrip, fileinput.input()))

rstrip 删除尾随换行符和空格。