2016-11-22 54 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。我认为它在功能上发生了变化,但事实并非如此。当我将其设置为全局函数时,我得到的错误全局名称未定义。我会挖掘! –