如果我在python中比较两个字符串,即使它们是相同的,我也会得到假

时间:2015-04-22 12:45:08

标签: python if-statement

我正在尝试比较两个字符串,一个是从文件中下载的,一个是文件,但if语句总是返回false,即使字符串相等。

我做错了吗? 这是Python中的错误吗?

代码:

#!/usr/bin/python
import json
import urllib2


jsonstring = urllib2.urlopen("https://xkcd.com/info.0.json").read()
j = json.loads(jsonstring)
current_xkcd = j['num']
print current_xkcd
with open ("xkcd.num", "r") as file:
        downloaded_xkcd = file.read().replace('\n', '')
print downloaded_xkcd

if current_xkcd == downloaded_xkcd:
        print "Already got latest xkcd"
else:
        print "Downloading xkcd..."

输出:

1515
1515
Downloading xkcd...

4 个答案:

答案 0 :(得分:9)

json.loads将数据转换为Python类型。您正在查看整数并将其与字符串进行比较。

而不仅仅是print current_xkcd,请尝试print repr(current_xkcd)print type(current_xkcd),并对downloaded_xkcd执行相同操作。

答案 1 :(得分:3)

您的具体问题是您甚至不打算比较两个字符串。

Json是一个丰富的序列化协议,当您使用下载的数据执行json.loads时,无论数字是什么,都会成为适当类型的数字:

>>> import json
>>> import urllib2
>>> jsonstring = urllib2.urlopen("https://xkcd.com/info.0.json").read()
>>> j = json.loads(jsonstring)
>>> type(j["num"])
<type 'int'>

在Python中,与PHP,Javascript,shellscript不同,包含“2”字符的字符串不会与数字2相等。 只需将您在文件中记录的数字转换为整数,也可以进行比较:

downloaded_xkcd = int(file.read().strip())

但是他们,您也可以只在文件中存储数据的json表示,或者使用“shelve”或“pickle”将正确的序列化数据存储在您的文件中,而不是手工完成 - 导致手动转换策略,如你的“.replace(...)”和我的“strip()” - 在很多极端情况下都会(并且会)失败。

答案 2 :(得分:2)

好的,我发现了问题。

json.loads()['num']返回了一个int而不是一个字符串。

通过更改为current_xkcd = str(j[num])

来修复它

答案 3 :(得分:1)

您是否尝试使用string.strip()从字符串中删除空格?所以试试这个

current_xkcd = current_xkcd.strip()
downloaded_xkcd = downloaded_xkcd.strip()

在比较之前