为什么这些字符串不相等?

时间:2016-08-12 08:19:28

标签: python python-2.7 input

我一直在尝试(供我个人使用)一些人['定时键盘输入的解决方案和唯一有效的键盘输入是Alex Martelli / martineau here.我使用了他们的第二个代码块(从导入msvcrt开始),除了比较之外,几乎所有东西都很好用。如果没有及时输入输入,我用空字符串替换了None的返回,我使用了一些测试行,如下所示:

import msvcrt
import time 

def raw_input_with_timeout(prompt, timeout):
    print prompt,    
    finishat = time.time() + timeout
    result = []
    while True:
        if msvcrt.kbhit():
            result.append(msvcrt.getche())
            if result[-1] == '\r':   # or \n, whatever Win returns;-)
                return ''.join(result)
            time.sleep(0.1)          # just to yield to other processes/threads
        else:
            if time.time() > finishat:
                return ""

textVar = raw_input_with_timeout("Enter here: \n", 5)
print str(textVar)    # to make sure the string is being stored
print type(str(textVar))   # to make sure it is of type string and can be compared
print str(str(textVar) == "test")
time.sleep(10)   # so I can see the output

用pyinstaller编译后,运行它,然后在窗口中键入test,我得到这个输出:

Enter here:
test
test
<type 'str'>
False

我原本认为比较是返回False,因为函数会将字符附加到数组中,这可能与它没有与字符串进行正确比较有关,但是在深入研究Python的工作方式之后(即SilentGhost的回复here),我真的不知道为什么比较不会返回True。任何回应表示赞赏。谢谢!

3 个答案:

答案 0 :(得分:2)

仅通过打印,您将无法看到字符串的不同之处。字符串值可以包含打印时在控制台上不容易看到的字节。

使用repr() function生成调试友好的表示。此表示形式将字符串格式化为Python字符串文字,仅使用可打印的ASCII字符和转义序列:

>>> foo = 'test\t\n'
>>> print foo
test

>>> foo == 'test'
False
>>> print repr(foo)
'test\t\n'

在您的情况下,您的包括返回值中的\r回车符:

if result[-1] == '\r':
    return ''.join(result)

最后\r仍然存在,因此您至少获得了值'test\r',但在打印时不会显示\r

>>> print 'test\r'
test
>>> print repr('test\r')
'test\r'

通过切换字符串,您可以在加入时排除最后一个字符:

return ''.join(result[:-1])

或者您可以使用str.strip()从字符串的开头和结尾删除所有空格字符(包括\r字符):

return ''.join(result).strip()

请注意,此处使用str()来电是没有意义的。您返回str个对象,因此str(textVar)是多余的。此外,print会在任何字符串对象上调用str()

答案 1 :(得分:1)

如果你考虑这段代码:

result = []
while True:
    if msvcrt.kbhit():
        result.append(msvcrt.getche())
        if result[-1] == '\r':   # or \n, whatever Win returns;-)
            return ''.join(result)

您可以看到,在构建输入字符串时,用户输入的最终字符必须是\r,这是与回车符对应的不可打印字符。因此,返回的输入字符串如下所示:

test\r

我认为您需要修改代码以从输入中丢弃最终的不可打印字符。

答案 2 :(得分:0)

字符串后面可能有一些看不见的字节。尝试print([c for c in textVar]),如果它显示字符谎言'\r'\n,请尝试str(textVar).strip() == "test"或手动删除这些字符。