2015-04-05 6 views
4

Я получаю, как открывать файлы, а затем использовать с ними встроенные функции Python. Но как работает sys.stdin?Что читает sys.stdin?

for something in sys.stdin: 
    some stuff here 

lines = sys.stdin.readlines() 

В чем разница между двумя вышеупомянутыми вариантами использования sys.stdin? Где он читает информацию? Это через клавиатуру, или мы все еще должны предоставить файл?

+0

Вы знакомы с 'input()'? Везде, где 'input()' будет принимать входные данные, это 'sys.stdin'. Это может быть терминал, или он может быть направлен из файла, или он может поступать из вывода другой программы, или может быть что-то еще, в зависимости от того, как вы вызывали программу. – user2357112

ответ

5

Таким образом, вы использовали Пайтон «предварительно встроенными функции», по-видимому, как это:

file_object = open('filename') 
for something in file_object: 
    some stuff here 

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

Вы могли бы вместо этого использовать:

file_object = open('filename') 
lines = file_object.readlines() 

, который считывает строку из текущей позиции файла в список.

Теперь sys.stdin - это еще один объект, который открывается Python перед запуском вашей программы. То, что вы делаете с этим файловым объектом, зависит от вас, но на самом деле оно не отличается от любого другого файлового объекта, а именно, что вам не нужен open.

for something in sys.stdin: 
    some stuff here 

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

lines = sys.stdin.readlines() 

Ваш первый вопрос действительно о различных способах использования файлового объекта.

Во-вторых, где он читает? Это чтение из дескриптора файла 0 (ноль). В Windows это дескриптор файла 0 (ноль). Файловый дескриптор/дескриптор 0 подключен к консоли или tty по умолчанию, поэтому по сути это чтение с клавиатуры. Однако это может быть перенаправлены, часто оболочкой (например, Баш или cmd.exe), используя синтаксис, как это:

myprog.py < input_file.txt 

Это изменяет дескриптор файла нулевого чтения файла вместо клавиатуры. В UNIX или Linux используется базовый вызов dup2(). Прочтите документацию к оболочке для получения дополнительной информации о перенаправлении (или, может быть, man dup2, если вы храбры).

3

Считывание из стандартного ввода - и оно должно быть обеспечено клавиатурой в виде данных потока.

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

В Python метод readlines() читает весь поток, а затем разбивает его на символ новой строки и создает список каждой строки.

lines = sys.stdin.readlines() 

выше создает список под названием линии, где каждый элемент будет строка (как определено в конце строки символов).

Подробнее об этом можно узнать на input and output section руководства Python.

Если вы хотите, чтобы подсказать пользователю для ввода, используйте метод input() (в Python 2, используйте raw_input()):

user_input = input('Please enter something: ') 
print('You entered: {}'.format(user_input)) 
+0

Итак, как стандартный ввод читается по-разному, когда я использую sys.stdin.readlines() вместо sys.stdin. Второе достигает каждого слова? Я все еще смущен. – Vimzy

2
for something in sys.stdin: 
    some stuff here 

Код выше не работает, как вы ожидаете, потому что sys.stdin это дескриптор файла - это дескриптор файла для stdin. Это не достигнет линии some stuff here

lines = sys.stdin.readlines() 

Когда сценарий выше, выполняется в интерактивной оболочки, он будет блокировать выполнение до тех пор, пока пользователь не нажмет Ctrl-D, который указывает на конец ввода.

+0

Итак, как стандартный ввод читается по-разному, когда я использую sys.stdin.readlines() вместо sys.stdin. Достигает ли второе слово каждое слово? Я все еще смущен. – Vimzy