Как я могу избежать ошибки EOFError для input() после использования Ctrl-D с sys.stdin.readlines () в Python 3?

Я новичок, пытаюсь научить себя Python для личного роста и развития. Так что, пожалуйста, расслабься со мной. (Если у вас возникнут вопросы по биологии, я буду рад ответить вам одолжением!)

Я пытаюсь написать программу в PyCharm CE на MacOSX (10.14.2 Mojave), чтобы сделать следующее:

1) позволить пользователю вводить кусок текста с несколькими строками одновременно путем копирования / вставки из источника. Например:

Мэри и Бет

пошел в

парк.

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)

Пока все хорошо - отпечатки из одной строки "Мэри и Бет пошли в парк".

Проблема в коде, когда я использую обычную функцию input()...

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

Я получаю следующее сообщение об ошибке: EOFError: EOF при чтении строки

Я видел сообщения других людей с похожей проблемой, и в некоторых ответах предлагается попробовать...

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(), но безрезультатно.

На этом я сдался и решил спросить профессионалов: а) Есть ли лучшие подходы к тому, чтобы пользователь копировал и вставлял многострочный текст в программу; б) Если мой подход до сих пор в порядке, как я могу избавиться от OSError, не сломав мой компьютер?

Заранее спасибо! Мариано

1 ответ

Решение

Sys .stdin.readline() - не лучшее решение.

Вы можете использовать fileinput модуль:

import fileinput

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

fileinput будет проходить через все строки ввода, указанные как имена файлов, указанные в аргументах командной строки, или стандартный ввод, если аргументы не указаны.

Ваш код можно заменить на

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

rstrip удаляет перевод строки и пробелы в конце.

Другие вопросы по тегам