Получение входных данных пользователя с помощью sys.stdin

#python-3.x #stdin

#python-3.x #stdin

Вопрос:

 import sys

data = []
for line in sys.stdin:
    data.append(line)
  

Я не использовал .read() или .readline()
, но этот код работает для чтения данных. Он считывает данные построчно. Входные данные разделяются на 'n' . данные вводятся пользователем. например, ‘input ()’ .

Мой вопрос:

  1. Это .read() .readline() необходимо или нет?
  2. Интересно, почему for цикл работает sys.stdin и как он считывает данные построчно?

Ответ №1:

Если вы посмотрите на документацию sys , вы увидите, что sys.stdin sys.stdout / sys.stderr ) — это просто файловые объекты.

Эти потоки представляют собой обычные текстовые файлы, подобные тем, которые возвращаются open() функцией.

В документации о open() говорится:

Тип файлового объекта, возвращаемого open() функцией, зависит от режима. Когда open() используется для открытия файла в текстовом режиме (‘w’, ‘r’, ‘wt’, ‘rt’ и т.д.), Он возвращает подкласс io.TextIOBase ( io.TextIOWrapper в частности).

TextIOWrapper наследуется от IOBase , у которого есть __iter__ метод. Этот __iter__ метод позволяет перебирать строки в файле. Я не могу найти, где это указано в документации Python, но оно приведено в исходном коде для IOBase.

IOBase (и его подклассы) поддерживают протокол итератора, что означает, что объект IOBase можно перебирать, получая строки в потоке.