使用DataNitro,我如何打印一个python循环来优化,确保打印23行后,打印移动到相邻的列?

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

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'])types的代码),添加像i = 0东西,然后写最后一行打印像Cell(23,(1+i)).value = "----"但我无法弄清楚)如何使这项工作。 使用Cell(23,(1+i)).value = "----"行,它将在单元格B1中打印“—-”,然后再次覆盖列A中的所有结果,当你看到代码实际上在做什么的时候,它也是有意义的。

我不知所措,但我觉得答案相对简单,我只是想念它。 我经历了这个网站上提到的DataNitro和https://datanitro.com/docs/的9页结果:我找不到答案。 我将不胜感激任何帮助!

编辑:我意识到,没有关系,它打印5,然后移动到相邻的列。 我所需要做的只是将所有结果打印出来,而不会覆盖本身:可以将所有结果显示在一列中,或者将所有结果显示在一行中。

我从此尝试过

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

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

注释 :问题(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]) 

评论 :一些…返回less于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 

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

CellRangelen(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