2016-11-22 85 views
-2

我正在處理一個項目,我想從一個API(Strava)拉長數據列表並將它們放入MySQL數據庫中(未在代碼中顯示)。 API有一些限制,它們不允許每個請求拉超過200條記錄。因此,我需要找到一種方法來遍歷結果,但是在到達列表的末尾時停止(不管有多少頁面,它都不會返回完全空的,也不會出錯)。用循環遍歷Python,直到到達列表的末尾

因此,我定義了一個從API中提取數據的函數,並且JSON輸出中的第一個鍵是與列表中條目數相等的effort_count。我嘗試使用我構建的循環中的函數使用該數字來使用該函數遍歷列表。

import urllib2 
import json 

strava_api='xxxxxxx' 
def strava(segment_id,page,per_page): 

    access_token = strava_api 
    url='https://www.strava.com/api/v3/segments/' + str(segment_id) +'/leaderboard' +'?&access_token=' + access_token  

    final_url=url + "&page=" + str(page) + "&per_page=" + str(per_page) 
    json_obj=urllib2.urlopen(final_url) 

    data = json.load(json_obj) 
    effort_count=data['effort_count'] 

counter = 1 
max_page = effort_count/200+1 
for counter in range (1,max_page): 
    strava(894142,counter,200) # 894142 is an existing segment and 200 is the max number of records displayed 
    counter = counter + 1 

但是,當我運行這個時,我得到'effort_count'未定義的錯誤。這是因爲在這個循環中不可能使用函數中的變量嗎?有沒有解決方法?

ps我在編碼方面很新穎,所以很可能我完全採用錯誤的方法。

+0

這是因爲函數中定義的變量對於該函數是局部的。 – sytech

+0

efforts_count是本地到strava函數.. – ArunDhaJ

回答

0

實際上effort_count未在全局範圍內定義。

您可以通過在方法開始時聲明global來彌補這一點,例如,

def strava(segment_id,page,per_page): 
    global effort_count 

    access_token = strava_api 

但你還是留下調用你的方法之前effort_count被訪問的問題。

您還應該在腳本開始時將其初始化爲一些合理的默認值。

+0

感謝羅伯特!這實際上起作用。在strava函數之前,我定義了一個全局變量effort_count,然後將其設置爲300,並且在函數中重新定義它來自API的任何內容! (可能不是真正漂亮的編碼,但它的工作原理!) –

+0

很酷。你可以繼續,並將我的答案標記爲正確的答案:)也許甚至可以給它一個upvote! – robert

+0

嗯,過早地歡呼,認爲它是做我想做的事情,但因爲我把它設置爲300之前的功能它在整個腳本的其餘部分保持300。我認爲它在功能上發生了變化,但事實並非如此。當我將其設置爲全局函數時,我得到的錯誤全局名稱未定義。我會挖掘! –