我有以下字典:
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()