我正在使用grequest从多个网址中提取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中,第二个结果打印在单元格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 = Quantity
切换Cell("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
的内容,然后编写最后一条打印行以读取类似{ {1}}但我无法弄清楚(精神上)如何做到这一点。使用Cell(23,(1+i)).value = "----"
行,它只会在单元格B1中打印“----”,然后它会再次覆盖A列中的所有结果,当您看到代码实际正在执行的操作时,这也是有意义的。
我很茫然,但我觉得答案相对简单,我只是错过了。我在本网站上查看了9页的结果,提到了DataNitro和https://datanitro.com/docs/:我找不到答案。我将不胜感激任何帮助!
编辑:我意识到打印5然后移动到相邻列并不重要。我需要做的就是将所有结果打印到excel而不覆盖自己:可以将所有结果显示在一列中,或者所有结果显示在一行中。我已经尝试了
Cell(23,(1+i)).value = "----"
但是我遇到了同样的问题,它只是覆盖了第一个网址的数据。提前谢谢。
答案 0 :(得分: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/...进行比较
第一个是list of dict
,第二个是list of list
。使用[0, 1]
作为keys
,例如:
# Usage for list
row += json_to_cell('Buy', response.json()['result']['buy'], row, [0, 1])
评论:有些...返回少于5个数据条目,有时一个网址根本不起作用。
广义方法:
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