我正在尝试比较两个字符串,一个是从文件中下载的,一个是文件,但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...
答案 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()
在比较之前