![](/img/trans.png)
[英]How to iterate over a list of lists and print items of each list as a comma-delimited string
[英]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.