input () против sys.stdin.read () - PullRequest
7 голосов
/ 19 мая 2011
import sys
s1 = input()
s2 = sys.stdin.read(1)

#type "s" for example

s1 == "s" #False
s2 == "s" #True

Почему? Как я могу заставить input() работать правильно? Я пытался кодировать / декодировать s1, но это не работает.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 19 мая 2011

Если вы работаете в Windows, вы заметите, что результат input() при вводе 's' и вводе будет "s\r". Уберите все конечные пробелы из результата, и все будет в порядке.

6 голосов
/ 19 мая 2011

Вы не сказали, какую версию Python вы используете, поэтому я предполагаю, что вы использовали Python 3.2, работающий в Microsoft Windows.

Это известная ошибка, см. http://bugs.python.org/issue11272 «input () имеет возврат конца каретки в окнах»

Обходные пути могут включать использование другой версии Python, использование операционной системы, не являющейся windows, или удаление завершающего каретки, возвращающей любую строку (), возвращенную изinput().Вы также должны знать, что итерация по стандартному стандарту имеет ту же проблему.

0 голосов
/ 19 мая 2011

Во-первых, ввод будет выглядеть как eval (raw_input ()) , что означает, что все, что вы передадите ему, будет оценено как выражение Python.Я предлагаю вам использовать raw_input () вместо этого.

Я проверил ваш код, и он для меня равен:

import sys
s1 = input()
s2 = sys.stdin.read(1)

if s1==s2 and s1=="s":
    print "They're both equal s"

Это вывод:

flaper87@BigMac:/tmp$ python test.py 
"s"
s
They're both equal s

Использование sys.stdin.read (1) будет читать только 1 символ из stdin, что означает, что если вы передадите «s, будет прочитано только первое». Есть sys.stdin.readline (), который читает всю строку (включаяфинал \ n).

...