使用每个请求的有限行数和HTTP标头中的总行数循环PYTHON API调用?

时间:2018-03-26 17:52:37

标签: python-3.x http

我是Python的新手。我已经根据API指令编写了大量电力结算数据的API调用。受保护的API将请求限制为每个请求50,000行。 API指令提供HTTP响应头“X-TotalRows”,以帮助循环遍历整个数据集,这可能是数百万行。

我如何编写Python调用的循环来追加所有数据,一次50k行?我已经包含了初始数据集的代码(行1-50,000)但是没有知道如何使用HTML标题“X-TotalRows”追加整个数据集,一次50k。

说明建议使用HTML标头“X-TotalRows”循环数据并将Start Row参数更改为“1 + rowCount”。

这可能看起来很简单,但我已经搜索并试验了几个小时试图破解此代码。任何帮助表示赞赏。

import http.client, urllib.request, urllib.parse, urllib.error, base64

headers = {
    # Request headers
    'Ocp-Apim-Subscription-Key': 'xyz', 'content-type': 'application/json'
}

params = urllib.parse.urlencode({
    # Request parameters
    'download': 'true',
    'rowCount': '50000',
    'sort': 'datetime_beginning_ept',
    'order': 'asc',
    'startRow': 1,
    'isActiveMetadata': 'true',
    'fields': 'datetime_beginning_utc, datetime_beginning_ept, pnode_id, pnode_name, voltage, equipment, type, zone, system_energy_price_da, total_lmp_da, congestion_price_da, marginal_loss_price_da, row_is_current, version_nbr',
    #'datetime_beginning_utc': '{string}',
    'datetime_beginning_ept': '1-1-2018 00:00 to 1-31-2018 23:00',
    #'pnode_id': '{number}',
    #'pnode_name': '{string}',
    #'voltage': '{string}',
    #'equipment': '{string}',
    #'type': '{string}',
    'zone': 'aep;comed;pseg'
})

try:
    conn = http.client.HTTPSConnection('api.pjm.com')
    conn.request("GET", "/api/v1/da_hrl_lmps?%s" % params, "{body}", headers)
    response = conn.getresponse()
    print(response.status, response.reason)
    data = response.read()
    #print(data)
    conn.close()
    file = open('output.txt', 'w')
    s=str(data)
    file.write(s)
    file.close()
    print("Go to ouput.txt")
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

1 个答案:

答案 0 :(得分:0)

我找到了答案:

strtotalcount = response.headers ['X-TotalRows']

totalcount = int(strtotalcount)

然后使用rowcount和totalcount将数据循环到追加模式的文件中。