2015-04-22 97 views
3

我試圖比較兩個字符串,一個是從文件中下載的,一個是if語句返回總是false,即使字符串相等。如果我在python中比較兩個字符串,即使它們是相同的,我也會得到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... 
+3

也許在字符串中有一些祕密隱藏的空白字符。試試'print repr(current_xkcd)'和'print repr(downloaded_xkcd)'來查看是否有任何標籤或任何顯示。 – Kevin

+0

像凱文說的那樣,我打賭最後有一個'\ r'。 – Jkdc

+2

打印'type(current_xkcd)'和'type(downloaded_xkcd)'。你可能有一個字符串和一個unicode字符串。 –

回答

9

json.loads的數據進行翻譯到Python類型以前那麼試試這個

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

。您正在查看一個整數並將其與字符串進行比較。

而不僅僅是print current_xkcd,請嘗試print repr(current_xkcd)print type(current_xkcd),並且爲downloaded_xkcd做同樣的事情。

+1

這似乎是問題所在。我將OP的代碼運行到'print current_xkcd',打印它的類型確實表明它是一個int。 – Kevin

1

你甚至嘗試從字符串刪除空白string.strip()?比較它們

+0

不,但我通過'hd'檢查輸出是否包含任何空格。它不會 – adnidor

+0

JSON會將其Web數據轉換爲數字數據類型。這就是發生了什麼事情。 – jsbueno

2

好的,我發現了這個問題。

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

固定它通過改變current_xkcd = str(j[num])

+0

不要忘記標記John Y的答案,以確保下一個有相同問題的用戶的利益。 –

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,Java腳本,shell腳本,包含「2」字不等於比較一串數字2. 只是轉換你已經記錄在整數文件中的數目,以及-SO你能夠做出比較:

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

但他們,你也可以在文件中存儲數據的json表示,或者使用「shelve」或「pickle」將正確的序列化數據存儲在文件中,而不是手工完成 - 這會導致手動轉換策略你的「.replace(...)」和我的「strip()」 - 這可以(並且)會在很多角落案例中失敗。

相關問題