Вложенный цикл в Python при использовании нескольких параметров в вызовах API - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть программа для вызова API, возврата данных JSON и записи их в CSV.Программа просматривает список объектов в качестве первого параметра в вызове API, но теперь также необходимо выполнить цикл по второму набору параметров (время начала и окончания в эпоху), потому что API имеет максимум времени для извлечения данных за неделювремя.

Пример:

Вызов API: ex.com/api/entity/timecards?start_time=1531306800&end_time=1531846800&pretty=1

Так что мне нужно перебрать все сущности, а затем циклически просматривайте данные за весь год, каждую неделю.

пример кода на данный момент для функции вызова API:

 def callAPI(entities):
        for j in range(len(entities)):

           locnum = entities[j][:5]
           locnumv = entities[j]

           startTime =
           endTime = 

           url = "http://ex.com/api/entity/" + entity[j] + "/timecards?start_time=" + startTime + "&end_time=" + endTime

           querystring = {"pretty":"1"}

           headers = {
            'Api-Key': ""
            }

           r = requests.request("GET", url, headers=headers, params=querystring)

           d = r.json()

Затем программа продолжает записывать данные в строки в CSV, что является успешным при тестировании с циклическим просмотромсущности со статическими временными параметрами.

Так что мне просто нужно выяснить, как бы я создал еще один вложенный цикл для циклического просмотра времени начала / окончания + 518400 секунд (6 дней вместо 7, чтобы быть безопасным) и с учетом времени ожидания с этого моментафактически будет более 20 000 вызовов API к тому времени, когда все будет сказано и сделано?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Прежде всего, поскольку вы просто используете j для получения текущей сущности, вы можете заменить for j in range(len(entities)) на for entity in entities, это выглядит лучше.Что касается вопроса, вы можете просто использовать внутренний цикл for для итерации каждую неделю.Весь код будет:

def callAPI(entities):
  for entity in entities:
    locnum = entity[:5]
    locnumv = entity # This is redundant

    START = 1531306800  # starting time, 1 year ago
    END = START + 31536000  # final time, e.g. the current time
    TIME_STEP = 518400  # 1 day, 1 week, 1 month

    for start_time in range(START, END, TIME_STEP):
      end_time = start_time + TIME_STEP - 1 # substract 1 for preventing overlap of times

      url = "http://ex.com/api/entity/%s/timecards?start_time=%d&end_time=%d" % (entity, start_time, end_time)

      querystring = {"pretty":"1"}

      headers = {'Api-Key': ""}

      try:
          r = requests.request("GET", url, headers=headers, params=querystring)
      except:
          break

      d = r.json()

      # Do something with the data

Надеюсь, это поможет вам !!

0 голосов
/ 12 декабря 2018

Во-первых, вы можете просто сделать:

for entity in entities:

вместо:

for j in range(len(entities)):

и затем использовать entity вместо entities[j]

Когдадело доходит до циклического прохождения ваших эпохальных времен.Вам нужно будет установить время начала, а затем установить время окончания на start_time + 540000 внутри другого цикла:

   start_time = 1531306800
   i = 0
   while True:
       if i != 0:
           start_time = end_time

       end_time = start_time + 540000

       url = "http://ex.com/api/entity/" + entity + "/timecards?start_time=" + start_time + "&end_time=" + end_time

       querystring = {"pretty":"1"}

       headers = {'Api-Key': ""}

       try:
           r = requests.request("GET", url, headers=headers, params=querystring)
       except:
           break

       d = r.json()

По сути, вы будете проходить все времена эпох, пока запрос не завершится неудачей.Как только это произойдет, вы выйдете из цикла и перейдете к следующему объекту.URL новой сущности начнется в то же время, что и сущность до нее, и т. Д.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...