2015-05-19 69 views
1

我試圖通過Python讀取API調用的結果,我使用基本應用程序/腳本作爲起點。使用Python澄清讀取API結果

我有點在腳本中的一個點混淆,其中讀取操作發生:

result=urllib2.urlopen.read()[13:-1] 
        if result=="true": 
          logging.info('available') 

我的問題與13:-1專門處理。根據Python documentation,它似乎是應用程序讀取的偏移或起點。下面是給出一個例子:

>>> f.seek(-3, 2) # Go to the 3rd byte before the end 

這看起來與.read()稍有不同在我的腳本在我的分隔符是一個:而非,

爲了闡明它正在閱讀的內容,我使用了Ello API作爲示例。因此,它會讀取產生的結果看起來像這樣的鏈接:

{ 
available: true, 
suggestions: [ 
"crunchyfeelsfists", 
"crunchy_nicksshakes", 
"supercrunchy" 
] 
} 

所以我使用的示例腳本讀取「可用:真正的」行。

我的第一個問題是,使用:,之間的區別是什麼。我的下一個問題是,13:-1如何讀取API結果的第二行?

任何幫助,將不勝感激!

+0

*使用:和*之間有什麼區別,它們沒有任何關係,也不能用這種方式進行比較。一個是函數調用,另一個是列表分片操作 –

回答

1

方括號中的數組表示法與read()返回的數據有關,而不是作爲seek()的參數。 [13:-1]表示從第13個字節開始停止,倒數第二個字節。

它跳過響應數據(「available:」)和逗號(最後一個字節),查看響應是否爲「true」。

4

你不應該通過json響應對象手動尋找那樣的東西。你應該使用JSON內置庫

只是做

data = json.loads(urllib2.urlopen.read()) 
print data["available"] 
print data["suggestions"] 
... 

特別是因爲有可能很少或幾乎沒有保證,「可用」總是會在JSON響應第一個關鍵輸出(因爲字典本身不支持訂購)

或者乾脆使用請求庫

data =requests.get(my_endpoint,data=my_data,headers=my_header).json() 

我知道這並沒有解決OP的原切片的問題(其他答案解決就好了)

0

略有改善@Joran Beasley將處理異常:

try: 
    data = json.loads(urllib2.urlopen.read()) 
    print data.get('avaiable', 'A default value if available wasnt passed') 
    # etc etc 
except ValueError: 
    print "JSON Decoding failed. No data." 
0

[:]語法表示切片。有關切片的更多信息,請參閱Explain Python's slice notation上的@Greg Hewgill回答。切片的結果是返回給您的。

至於切片和(,)語法之間的區別:

Python documentation

要更改文件對象的位置,使用f.seek(偏移,from_what)。 該位置是通過將偏移量添加到參考點來計算的; 參考點由from_what參數選擇。一個from_what 值從文件的開頭開始,1使用當前的 文件位置,2使用文件的結尾作爲參考點。 from_what可以省略,默認爲0,以 文件的開頭爲參考點。

在這方面.seek()是需要兩個參數offsetfrom_what的方法。當您調用某個方法時,可以使用,來分隔參數。