Использование sys.stdin.readline() для чтения нескольких строк из cmd в Python

Я хотел бы ввести свой ввод из командной строки после запуска

if __name__ == "__main__":
    data = list(map(int, sys.stdin.readline().split()))
    print(data)
    n, capacity = data[0:2]
    values = data[2:(2 * n + 2):2]
    weights = data[3:(2 * n + 2):2]

Пример ввода может быть:

2 40
20 2
30 3

Мои вопросы:
1) Как создать список данных, используя мой ввод?
2) Как я могу сообщить Python, что я закончил ввод, и он должен выполнить остальную часть кода?

2 ответа

Решение

Решение этой проблемы зависит от используемой вами ОС.
По сути, если вы хотите многострочный ввод, вам придется использовать sys.stdin.read() вместо sys.stdin.readline(), поскольку sys.stdin файловый объект в Python, read() Метод будет читать, пока не достигнет конца файла. Он отмечен специальным символом EOF (Конец файла). На разных ОС есть разные способы отправки.

В Windows:
Нажмите Ctrl+Z после ввода и затем нажмите Enter:

2 10
20 2
30 3
^Z

На ОС Unix:
Нажмите Ctrl+D после ввода. Вход не требуется (я считаю)

Если вы хотите получить список [2, 10, 20, 2, 30, 3] с вашего вклада, вы в порядке. split() метод разбивается по пробелам (пробелы, переводы строк и т. д.).

Если вы работаете в Windows, убедитесь, что вы завершили ввод новой строкой, иначе ^Z (от нажатия Ctrl-Z) будет включено в ваш ввод. Также убедитесь, что вы используете макет на английском языке - /questions/14266295/kak-zavershit-vvod-sysstdinreadlines/14266302#14266302

Я согласен со всем, что сказал Лева7. Тем не менее, я бы предложил другое решение, которое заключается в использовании raw_input для Python 2 или input для Python 3 вроде так:

args = []
s = raw_input()                # input() for Python 3
while s != '':
    args.extend([int(arg) for arg in s.strip().split()])
    s = raw_input()

Конечно, это ни в коем случае не однострочник, но он делает свою работу, и легко увидеть, как это делается. Кроме того, никаких специальных символов не требуется в конце ввода.

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