如何在将列表中的每个值传递给 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。但是 API 在我传递的 ID 数量方面的某个点后中断。
我继续使用以下代码将列表分成 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)
提前谢谢你。
您可以在执行内部循环后使用 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
我有一个如下所示的列表:
lst = [1,2,3, etc]
我可以成功迭代此列表并将 ID 传递到 API。但是 API 在我传递的 ID 数量方面的某个点后中断。
我继续使用以下代码将列表分成 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)
提前谢谢你。
您可以在执行内部循环后使用 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