Как я могу избежать ошибки 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 удаляет перевод строки и пробелы в конце.