如何遍历列表列表,同时将列表中的每个值传递给API并在每个列表列表之后暂停?

时间:2018-08-16 17:11:34

标签: python python-3.x list loops api-design

我有一个看起来像这样的列表:

lst = [1,2,3, etc]

我可以成功地遍历此列表,并将ID传递给API。但是,关于我传递的ID数,API在某些点后中断。

我继续使用以下代码将列表分成50个块:

def chunks(l, n):
    # For item i in a range that is a length of l,
    for i in range(0, len(l), n):
        # Create an index range for l of n items:
        yield l[i:i+n]

a = list(chunks(lst, 50))

a变量是如下所示的列表列表:

[[1,2,3][4,5,6]]

如何遍历列表列表,将单个ID传递到API代码(如下),同时在每个块之后将代码暂停10秒?

此外,如果API中断,我是否可以强制API继续其余代码?现在不是必需的,因此这是可选的。

API代码:

lst1=[]
for i in lst:
    #print (row)
    url = 'url/Id={}'.format(i)
    r = requests.get(url).text
    lst1.append(xml_data1)
    #time.sleep(1)
    print(xml_data1)

先谢谢您。

1 个答案:

答案 0 :(得分:2)

执行内部循环后,可以使用双for循环和sleep函数。这是一个示例:

lst1 = []
for chunk in a:
    for id in chunk:
        url = 'url/Id={}'.format(id)
        xml_data = requests.get(url).text
        lst1.append(xml_data)
     sleep(10) # will pause execution for 10 seconds

要回答有关API引发错误时如何继续执行的第二个问题,可以使用try/except。可能引发错误的代码进入try块,如果引发了错误,执行将移至except块,该块指定如何继续。如果您将代码包装在一个函数中,则可以使其变得更容易。

我发现使用可用于指数退避的关键字参数来跟踪您尝试调用特定id的次数会有所帮助-根据这种方式,您等待更长的时间您尝试过很多次。

以下是基于上述代码的示例:

def get_data_on_id(id, try_num=1):
    url = 'url/Id={}'.format(id)
    try:
        return requests.get(url).text
    except:
        sleep(2**try_num) # exponential backoff
        return get_data_on_id(id, try_num=try_num + 1)

lst1 = []
for chunk in a:
    for id in chunk:
        xml_data = get_data_on_id(id)
        lst1.append(xml_data)
    sleep(10)

上面的代码与之前的代码基本相同,但是请求逻辑包装在get_data_on_id函数中,该函数包含try/except块。如果在请求url时抛出错误,该函数将等待2^try_num秒,然后重试。

您可能还希望except个特定的错误并以不同的方式处理它们(或者是明确的,以便仅准备处理except个错误)。以下是try/except上的文档:https://docs.python.org/3/tutorial/errors.html