input () vs sys.стандартный ввод.читать()

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

#type "s" for example

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

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

спасибо.

3 ответов


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


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

Это известная ошибка см. http://bugs.python.org/issue11272 "input () имеет возврат задней каретки на windows"

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


во-первых, ввод похож на eval (raw_input ()) что означает, что все, что вы передаете, он будет evalualted как питон экспресьон. Я предлагаю вам вместо этого использовать 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.стандартный ввод.read (1) будет читать только 1 символ из stdin, что означает, что если вы передадите "s" только первый " будет прочитан. Есть система.стандартный ввод.с readline (), которая читает вся строка (включая final \n).