Выход из программы при вводе пустой строки (sys.stdin)

Перепробовал различные способы, но так и не понял как добиться завершения программы при вводе пустой строки. Я прочитал, что если строка line пустая, то можно выйти условием if not line, но это тоже не помогает. Ловить ошибку при вводе ctrl+D я не хочу, интересует именно завершение программы при вводе пустой строки. Подскажите, пожалуйста, как правильно это сделать? Спасибо!

P.S. Код ниже

import sys
import os

with open('task1.txt', 'a') as some_file:
    for line in sys.stdin:
        if not line:
            print(f"Файл был успешно записан. Вы можете найти его по адресу {os.path.join(os.getcwd(), 'task1.txt')}")
        else:
            some_file.write(line)

Ответы (3 шт):

Автор решения: Zhihar
for line in sys.stdin:
    if len(line) > 1:
        print(line)
    else:
        break

print("вышли")

вот так сможете выходить

вроде как ввод тоже при таком получении данных находится в строке, поэтому это надо учесть (что 1 символ всегда присутствует)

чтобы это более четко увидеть, можно выполнить такой код:

for line in sys.stdin:
    if line == '\n':
        break

    # вывести введённую строку без последнего символа (который является символом '\n')
    print(line[:-1])

print("вышли")
→ Ссылка
Автор решения: Михаил Муругов

Предлагаю более интересный способ:

for line in iter(input, ''):
    print(f'Введена строка: {line}')
else:
    print('Была введена пустая строка, цикл закончен')

Объяснение:

  • iter(input, '') - создаёт итератор, который на каждой итерации будет вызывать функцию input() и сверять полученное значение из функции с пустой строкой. Если из функции вернулась не пустая строка (т.е. что-то ввели в input()), то введёное значение будет обработано в теле цикла;
  • Если в input() на предыдущем шаге ничего не ввели (вернулась пустая строка ''), то, значит, цикл заканчивается и попадает в блок else, который выполняется после того, как цикл закончил свои итерации без прерывания (break).

Ссылки на документацию:

  1. iter(object[, sentinel])
  2. break and continue Statements, and else Clauses on Loops

На самом деле else здесь можно спокойно убрать, т.к. приведён просто для демонстрации. Т.е. без него код будет выглядеть:

for line in iter(input, ''):
    print(f'Введена строка: {line}')
print('Была введена пустая строка, цикл закончен')
→ Ссылка
Автор решения: Kers

У вас уже есть проверка на пустую строку просто допишите туда exit() и проверку на перевод строки:


import sys
import os

with open('task1.txt', 'a') as some_file:
    for line in sys.stdin:
        if not line or line == '\n': # перевод строки
            print(f"Файл был успешно записан. Вы можете найти его по адресу {os.path.join(os.getcwd(), 'task1.txt')}")
            exit() # выход из программы
        else:
            some_file.write(line)

В данном случае вы получите выход из программы даже если после цикла есть продолжение.

→ Ссылка