簡體   English   中英

如何在將列表中的每個值傳遞到 API 並在每個列表列表后暫停時迭代列表列表?

[英]How to iterate over list of lists while passing each value in the lists into API and pausing after each list of list?

我有一個看起來像這樣的列表:

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 繼續其余代碼? 現在不是必需的,所以這是可選的。

接口代碼:

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)

先感謝您。

您可以在執行內循環后使用sleep功能使用雙for循環。 下面是一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM