1

我正在使用 grequest 从多个 url 中提取 json 数据。在这里另一个用户的帮助下,我能够让 python 连续打印每个 url 的结果。现在,我想使用 DataNitro 将这些结果打印到 excel 中。这是我现在拥有的代码。

import grequests
import json


urls = [
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-1ST&type=both&depth=50',
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-AMP&type=both&depth=50',
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-ARDR&type=both&depth=50',
]

requests = (grequests.get(u) for u in urls)
responses = grequests.map(requests)

for response in responses:
    Cell("A1").value = "Buy"
    Cell("A2").value = (response.json()['result']['buy'][0]['Quantity'])
    Cell("A3").value = (response.json()['result']['buy'][0]['Rate'])
    Cell("A4").value = (response.json()['result']['buy'][1]['Quantity'])
    Cell("A5").value = (response.json()['result']['buy'][1]['Rate'])
    Cell("A6").value = (response.json()['result']['buy'][2]['Quantity'])
    Cell("A7").value = (response.json()['result']['buy'][2]['Rate'])
    Cell("A8").value = (response.json()['result']['buy'][3]['Quantity'])
    Cell("A9").value = (response.json()['result']['buy'][3]['Rate'])
    Cell("A10").value = (response.json()['result']['buy'][4]['Quantity'])
    Cell("A11").value = (response.json()['result']['buy'][4]['Rate'])
    Cell("A12").value = "Sell"
    Cell("A13").value = (response.json()['result']['sell'][0]['Quantity'])
    Cell("A14").value = (response.json()['result']['sell'][0]['Rate'])
    Cell("A15").value = (response.json()['result']['sell'][1]['Quantity'])
    Cell("A16").value = (response.json()['result']['sell'][1]['Rate'])
    Cell("A17").value = (response.json()['result']['sell'][2]['Quantity'])
    Cell("A18").value = (response.json()['result']['sell'][2]['Rate'])
    Cell("A19").value = (response.json()['result']['sell'][3]['Quantity'])
    Cell("A20").value = (response.json()['result']['sell'][3]['Rate'])
    Cell("A21").value = (response.json()['result']['sell'][4]['Quantity'])
    Cell("A22").value = (response.json()['result']['sell'][4]['Rate'])
    Cell("A23").value = "----"

这工作得很好,但前提是我注释掉除一个 url 之外的所有内容,否则第一个 url 的结果会被第二个 url 的结果覆盖,这是预期的结果。然而,这不是我想要的。最后,我希望第一个 url 的结果在单元格 A1:A23 中打印,第二个 URL 的结果在单元格 B1:B23 中打印,第三个在单元格 C1:C23 中打印。

这是我尝试过的:

for response in responses:
    #print("Buy")
    Quantity = [response.json()['result']['buy'][0]['Quantity'],
        response.json()['result']['buy'][1]['Quantity'],
        response.json()['result']['buy'][2]['Quantity'],
        response.json()['result']['buy'][3]['Quantity'],
        response.json()['result']['buy'][4]['Quantity']
]
    Cell("A1:E5").vertical = Quantity

(注意:我只是在这里尝试数量)。

这不起作用,因为它仅在 A 列中打印第一个 url 的结果,并且不会移动到 B 列以打印后续结果。我尝试使用 切换Cell("A1:E5").vertical = QuantityCell("A1:E5").vertical_range = Quantity但 python 返回以下错误:

    Cell("A1:E5").vertical_range = Quantity
  File "27\basic_io.py", line 379, in __setattr__
AttributeError: can't set attribute

我正在考虑使用我的原始设置(即使用Cell("A2").value = (response.json()['result']['buy'][0]['Quantity'])代码类型)做一些事情,添加类似的内容i = 0,然后编写最后一个打印行以读取类似的内容,Cell(23,(1+i)).value = "----"但我无法(精神上)弄清楚如何使它工作. 使用该Cell(23,(1+i)).value = "----"行,它只会在单元格 B1 中打印“----”,然后它会再次覆盖 A 列中的所有结果,当您看到代码实际在做什么时,这再次是有意义的。

我很茫然,但我觉得答案比较简单,我只是想念它。我浏览了该网站上提到 DataNitro 和https://datanitro.com/docs/的 9 页结果:我找不到答案。我将不胜感激任何帮助!

编辑:我意识到它打印 5 然后移动到相邻列并不重要。我需要做的就是将所有结果打印到 Excel 中而不覆盖自身:这可以是所有结果都显示在一列中,或者所有结果显示在一行中。

我已经尝试过

CellRange((1,1),(1,2)).value = [response.json()['result']['buy'][0]['Quantity'],
response.json()['result']['buy'][0]['Rate']

但我遇到了同样的问题,它只是覆盖了第一个 url 中的数据。提前致谢。

4

1 回答 1

1

评论:在重新运行脚本之前清除整个工作表的数据时,问题 (3) 已解决

重新运行脚本将始终以row = 1. 如果要将数据附加到现有图纸集row = MAX ROW OF OLD DATA +1


评论:这个脚本将如何随着不同的 JSON 结构而改变。比较 bittrex.com/api/v1.1/public/... 与 api.livecoin.net/exchange/order_book?currencyPair=ABN/...</p>

第一个是a list of dict,第二个是a list of list。使用[0, 1]as keys,例如:

# Usage for list
row += json_to_cell('Buy', response.json()['result']['buy'], row, [0, 1])

评论:一些...返回少于 5 个数据条目,或者有时,一个 URL 根本不起作用。

广义方法:

def json_to_cell(title, _json, start_row, keys):
    values = len(_json)
    if values:
        CellRange((start_row, 1), (start_row, 1)).value = [title]
        start_row += 1

        for row, key in enumerate(keys, start_row):
            rowData = []
            for c in range(0, values):
                rowData.append(_json[c][key])

            CellRange((row, 1), (row, values)).value = rowData
        return len(keys) + 1
    else:
        # Write some Info NO VALUES
        return 0

keys = ['Quantity', 'Rate']
row = 1
for response in responses:
    row += json_to_cell('Buy', response.json()['result']['buy'], row, keys)
    row += json_to_cell('Sell', response.json()['result']['sell'], row, keys)

    CellRange((row, 1), (row, 1)).value = ['----']
    row += 1

评论:IndexError:CellRange 设置为长度错误的对象

CellRange和都len(rowData)应该是 5。
添加一个print(...,见下文,并显示一个输出。

使用以下内容:

for row, response in enumerate(responses, 1):
    rowData = []
    for c in range(0, 5):
        rowData.append(response.json()['result']['buy'][c]['Quantity'])

    print( rowData)
    CellRange((row, 1),(row, 5)).value = rowData
于 2017-08-10T19:25:14.387 回答