Python 为列表中的每个元素调用API
我有一个超过1000个ID的列表,我想为列表中的每个元素调用一个具有不同端点的API。 例如: 我尝试了以下方法:Python 为列表中的每个元素调用API,python,json,loops,Python,Json,Loops,我有一个超过1000个ID的列表,我想为列表中的每个元素调用一个具有不同端点的API。 例如: 我尝试了以下方法: import json import requests import pandas as pd API_BASEURL = "https://exampleurl.com/" API_TOKEN = "abc" HEADERS = {'content-type' : 'application/json', 'Authorization': API_TOK
import json
import requests
import pandas as pd
API_BASEURL = "https://exampleurl.com/"
API_TOKEN = "abc"
HEADERS = {'content-type' : 'application/json',
'Authorization': API_TOKEN }
def get_data(endpoint):
for i in customerlist:
api_endpoint = endpoint
params = {'customerid' : i}
response = requests.get(f"{API_BASEURL}/{api_endpoint}",
params = params,
headers = HEADERS)
if response.status_code == 200:
res = json.loads(response.text)
else:
raise Exception(f'API error with status code {response.status_code}')
res= pd.DataFrame([res])
return res
get_data(endpointexample)
这是可行的,但它只返回列表803818的第一个元素的值。我希望函数从customerlist返回我在函数参数中定义的端点的每个ID的值
我发现了一个可能是相关的问题,但我无法解决我的问题
可能有一个简单的解决方案,我没有看到,因为我只是从Python开始。谢谢。函数点击return语句时,立即完成。因为您的return语句在循环中,所以实际上不会调用其他迭代 要修复此问题,您可以在循环外部创建一个列表,在每次循环迭代后将其追加,然后返回使用该列表创建的数据帧:
def get_data(endpoint):
responses = []
for i in customerlist:
api_endpoint = endpoint
params = {'customerid' : i}
response = requests.get(f"{API_BASEURL}/{api_endpoint}",
params = params,
headers = HEADERS)
if response.status_code == 200:
res = json.loads(response.text)
else:
raise Exception(f'API error with status code {response.status_code}')
responses.append(res)
return pd.DataFrame(responses)
一个更干净的解决方案是使用列表理解:
def get_data(endpoint, i):
api_endpoint = endpoint
params = {'customerid' : i}
response = requests.get(f"{API_BASEURL}/{api_endpoint}",
params = params,
headers = HEADERS)
if response.status_code == 200:
res = json.loads(response.text)
else:
raise Exception(f'API error with status code {response.status_code}')
return res
responses = pd.DataFrame([get_data(endpoint, i) for i in customerlist])
看起来你的缩进是错的。函数get_data末尾的Return语句位于for循环内部,它在第一个循环之后立即终止函数。将Return更改为yield
def get_data(endpoint, i):
api_endpoint = endpoint
params = {'customerid' : i}
response = requests.get(f"{API_BASEURL}/{api_endpoint}",
params = params,
headers = HEADERS)
if response.status_code == 200:
res = json.loads(response.text)
else:
raise Exception(f'API error with status code {response.status_code}')
return res
responses = pd.DataFrame([get_data(endpoint, i) for i in customerlist])