API调用中的for循环在每个循环中返回相同的结果

时间:2018-11-26 11:21:32

标签: json python-3.x api for-loop limesurvey

我编写了一个循环,用于根据ID列表从API(Limesurvey)检索数据,并使用每个循环的结果填充数据帧的一行。

我有一个ID如下的列表:

 # list of ids

 ids = ['1','427',... ,'847']

我用于基于列表的每个项目查询API的代码如下:

method = "get_participant_properties"
params = OrderedDict([
            ("sSessionKey", api.session_key),
            ("iSurveyID", 12345),
            ("aTokenQueryProperties", t), 
])

# loop through API query with the 'aTokenQueryProperties' stored in the list 'tids'.

attributes = []

for t in ids:
    attributes.append(api.query(method=method, params=params))

pd.DataFrame(attributes)

不幸的是,结果是一个具有158行的数据帧,并且每一行都是相同的,即我列表中最后一个ID的查询结果(847)。

1 个答案:

答案 0 :(得分:2)

您没有从循环中传入tt定义中的params是无关的;如果我现在要运行您的代码,我会得到一个NameError异常,因为此时尚未设置tt映射中的params表达式不是实时的,不会在每次循环迭代时更新。

在循环中设置'aTokenQueryProperties'

method = "get_participant_properties"
params = OrderedDict([
            ("sSessionKey", api.session_key),
            ("iSurveyID", 12345),
            ("aTokenQueryProperties", None), 
])

attributes = []

for t in ids:
    params["aTokenQueryProperties"] = t
    attributes.append(api.query(method=method, params=params))

在开始时将"aTokenQueryProperties" None对象中的params设置为OrderedDict是可选的;仅在保留params顺序的确切位置很重要的情况下才需要执行此操作,即使那样,因为在您的示例中,它是映射中的 last 元素,您需要最终还是得到相同的输出。