Samco API 字典问题



我有以下字典:

msg = {"response":{"data":{"aPr":"143.90","aSz":"75","avgPr":"190.12","bPr":"143.70","bSz":"75","c":"398.40","ch":"-254.50","chPer":"-63.88","h":"277.60","l":"123.20","lTrdT":"14 May 2020, 03:21:21 PM","ltp":"143.90","ltq":"75","ltt":"14 May 2020, 03:21:21 PM","lttUTC":"14 May 2020, 09:51:21 AM","o":"245.95","oI":"58275","oIChg":"-50100.00","sym":"59605_NFO","tBQ":"347625","tSQ":"44925","ttv":"425688175.07","vol":"2239050","yH":"277.60","yL":"0.00"},"streaming_type":"quote"}}

我想从中提取关键值。我正在使用以下代码:

ltp = msg(["ltp"])

但它显示:

error :string indices must be integers"
import requests
import pdb
import json
import pprint
import websocket
from websocket import WebSocketApp
import xlwings as xw
import datetime

name = "Tickdata"
wb = xw.Book('watchlist.xlsx')
sht3 = wb.sheets['Tickdata']
row_no = 2

def on_message(ws, msg):
global row_no
pdb.set_trace()
print (msg)
ltp = msg(["ltp"])

sht3.range('A' + str(row_no)).value = msg
row_no = row_no + 1
def on_error(ws, error):
print (error)
def on_close(ws):
print ("Connection Closed")
def on_open(ws):
print ("Sending json")
data='{"request":{"streaming_type":"quote", "data":{"symbols":[{"symbol":"59605_NFO"}, {"symbol":"59606_NFO"}]}, "request_type":"subscribe", "response_format":"json"}}'
ws.send(data)
ws.send("n")

headers = {'x-session-token': ''}
websocket.enableTrace(True)
ws = websocket.WebSocketApp("wss://stream.stocknote.com", on_open = on_open, on_message = on_message, on_error = on_error, on_close = on_close, header = headers)
ws.run_forever()

这是Samco"https://developers.stocknote.com/api/?python#search-equity-scrips"的API。

你可以像下面这样尝试:

msg = {"response":{"data":{"aPr":"143.90","aSz":"75","avgPr":"190.12","bPr":"143.70","bSz":"75","c":"398.40","ch":"-254.50","chPer":"-63.88","h":"277.60","l":"123.20","lTrdT":"14 May 2020, 03:21:21 PM","ltp":"143.90","ltq":"75","ltt":"14 May 2020, 03:21:21 PM","lttUTC":"14 May 2020, 09:51:21 AM","o":"245.95","oI":"58275","oIChg":"-50100.00","sym":"59605_NFO","tBQ":"347625","tSQ":"44925","ttv":"425688175.07","vol":"2239050","yH":"277.60","yL":"0.00"},"streaming_type":"quote"}}
d = msg['response']['data']
for key, value in d.items():
print(key)
print(value)

或者直接获取键值:

value = msg['response']['data']['ltp']

你不调用字典。正如用户@fas在注释中指出的那样,ltp不是直接在字典内部,而是嵌套在数据字典中,数据字典嵌套在响应字典中。所以你的代码将是:

ltp = msg["response"]["data"]["ltp"]

如果您希望它采用小数,请使用

ltp = float(msg["response"]["data"]["ltp"])

您必须逐级访问字典。

具有:

{'response': {'data': {'ltp': '143.90'}}}

您有三个级别:

msg['response']['data']['ltp']

会给你价值。如果你只想要键值,可以使用 keys(( 像这样:

msg['response']['data'].keys()

最新更新