2016-11-22 4 views
-2

Я работаю над проектом, где я хочу вытащить длинные списки данных из API (Strava) и поместить их в базу данных MySQL (не показано в коде). Существуют некоторые ограничения API, и они не позволяют извлекать более 200 записей за запрос. Поэтому мне нужно найти способ перебора результатов, но остановиться, когда достигнут конец списка (он никогда не возвращается полностью пустым и не выдает ошибок, независимо от того, сколько страниц я вытаскиваю).Итерация в Python с циклом до тех пор, пока не будет достигнут конец списка

Итак, я определил функцию, которая извлекает данные из API, а первый ключ в выводе JSON - это файл усилия, равный количеству записей в списке. Я пытаюсь использовать это число из функции в цикле, которую я создал для перебора по списку с помощью функции.

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

effort_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

Прохладный. Вы можете пойти дальше и пометить мой ответ как правильный, так что :) Может быть, даже дайте ему преимущество! – robert

+0

Хммм, слишком рано взбодрился, думал, что это делает то, что я хотел, но потому, что я установил его до 300, прежде чем функция останется 300 в остальной части сценария. Я думал, что это изменилось в функции, но это не так. Когда я устанавливаю его как глобальный в функции, я получаю глобальное имя ошибки, не определяется. Я буду копаться! –