python 3.4涉及字节文字的条件返回false而不是true

时间:2015-01-14 07:01:33

标签: python mysql conditional-statements pymysql

我使用python 3.4和pymysql连接MySQL DB。我有一个select查询然后fetchall将结果返回到r []。 r [0]只是结果元组的第一部分,它的值是一个空字符串(因为它应该基于数据库中的内容。)

但是,当我使用条件时:

if str(r[0]) == ''.encode('utf8'):
        do something...

条件评估为假,而不是我期望它是真的!我通过打印出部件的值来测试它以找出原因:

    print(str(r[0]))
    print(''.encode('utf8')) 
    print(str(r[0]) == ''.encode('utf8'))  

打印:

b''
b''
False

知道为什么吗?这让我疯了,因为它不应该这么难。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您正在比较字节和unicode,并且这必然会在Python 3中与False进行比较。一些引用:

http://scikit-bio.org/docs/0.1.3/development/py3.html#gotchas

http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/

解决方法是不要在右侧的空字符串上调用encode()

Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> str(r[0]) == ''
True

如您所见,encode()对象上str的结果是字节:

>>> x = ''.encode('utf8')
>>> type(x)
<class 'bytes'>