Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用请求及其会话在Python中解析JSON输出_Python_Json_Parsing - Fatal编程技术网

使用请求及其会话在Python中解析JSON输出

使用请求及其会话在Python中解析JSON输出,python,json,parsing,Python,Json,Parsing,这里我有一个输出以下内容的费率流,我希望只打印“出价”价格。有人能帮我解释一下如何正确解析输出吗?这快把我逼疯了 示例=1.05653 我需要不带引号或任何其他标记的输出 JSON 我的代码: import requests import json from optparse import OptionParser def connect_to_stream(): """ Environment <Domain> fxTrade

这里我有一个输出以下内容的费率流,我希望只打印“出价”价格。有人能帮我解释一下如何正确解析输出吗?这快把我逼疯了

示例=1.05653

我需要不带引号或任何其他标记的输出

JSON

我的代码:

import requests
import json

from optparse import OptionParser

def connect_to_stream():
    """
    Environment           <Domain>
    fxTrade               stream-fxtrade.oanda.com
    fxTrade Practice      stream-fxpractice.oanda.com
    sandbox               stream-sandbox.oanda.com
    """

    # Replace the following variables with your personal ones
    domain = 'stream-fxpractice.oanda.com'
    access_token = 'xxxxx'
    account_id = 'xxxxxxxxx'
    instruments = "EUR_USD"

    try:
        s = requests.Session()
        url = "https://" + domain + "/v1/prices"
        headers = {'Authorization' : 'Bearer ' + access_token,
                   # 'X-Accept-Datetime-Format' : 'unix'
                  }
        params = {'instruments' : instruments, 'accountId' : account_id}
        req = requests.Request('GET', url, headers = headers, params = params)
        pre = req.prepare()
        resp = s.send(pre, stream = True, verify = False)
        return resp
    except Exception as e:
        s.close()
        print "Caught exception when connecting to stream\n" + str(e) 

def demo(displayHeartbeat):
    response = connect_to_stream()
    if response.status_code != 200:
        print response.text
        return
    for line in response.iter_lines(1):
        if line:
            try:
                msg = json.loads(line)
            except Exception as e:
                print "Caught exception when converting message into json\n" + str(e)
                return
                if msg.has_key("instrument") or msg.has_key("tick"):
                    print line                  

            if displayHeartbeat:
                print line
            else:
                if msg.has_key("instrument") or msg.has_key("tick"):
                print line

def main():
    usage = "usage: %prog [options]"
    parser = OptionParser(usage)
    parser.add_option("-b", "--displayHeartBeat", dest = "verbose", action = "store_true", 
                        help = "Display HeartBeat in streaming data")
    displayHeartbeat = False

    (options, args) = parser.parse_args()
    if len(args) > 1:
        parser.error("incorrect number of arguments")
    if options.verbose:
        displayHeartbeat = True
    demo(displayHeartbeat)


if __name__ == "__main__":
    main()
导入请求
导入json
从optpasse导入OptionParser
def connect_to_stream():
"""
环境
fxTrade stream-fxTrade.oanda.com
fxTrade Practice stream-fxpractice.oanda.com
sandbox stream-sandbox.oanda.com
"""
#用个人变量替换以下变量
域='stream fxpractice.oanda.com'
访问令牌='xxxxx'
帐户id='xxxxxxxxx'
工具=“欧元/美元”
尝试:
s=请求。会话()
url=“https://“+domain+”/v1/prices”
headers={'Authorization':'Bearer'+访问令牌,
#“X-Accept-Datetime-Format”:“unix”
}
params={'instruments':instruments,'accountId':account_id}
请求('GET',url,headers=headers,params=params)
pre=req.prepare()
resp=s.send(pre,stream=True,verify=False)
返回响应
例外情况除外,如e:
s、 关闭()
打印“连接到流时捕获的异常\n”+str(e)
def演示(显示心跳):
响应=将_连接到_流()
if response.status_代码!=200:
打印response.text
返回
对于响应线路。iter_线路(1):
如果行:
尝试:
msg=json.loads(第行)
例外情况除外,如e:
打印“将消息转换为json时捕获的异常\n”+str(e)
返回
如果消息有按键(“仪器”)或消息有按键(“勾选”):
打印行
如果显示心跳:
打印行
其他:
如果消息有按键(“仪器”)或消息有按键(“勾选”):
打印行
def main():
用法=“用法:%prog[选项]”
parser=OptionParser(用法)
parser.add_选项(“-b”,“--displayHeartBeat”,dest=“verbose”,action=“store_true”,
help=“在流数据中显示心跳”)
displayHeartbeat=False
(options,args)=parser.parse_args()
如果len(args)>1:
parser.error(“参数数量不正确”)
如果options.verbose:
displayHeartbeat=True
演示(显示心跳)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
很抱歉,如果这是一个非常基本的问题,但我对python不太熟悉


提前谢谢

试试下面这句话:

def demo(displayHeartbeat):
    response = connect_to_stream()
    for line in response.iter_lines():
        if line.startswith("        \"bid\"")
            print "bid:"+line.split(":")[1]

您正在逐行迭代流,试图将每一行解析为JSON。每一行都不是正确的JSON,所以这是一个问题

我只需对您引入的每个hline进行正则表达式,查找文本“bid:”后跟一个十进制数字,然后将该数字作为浮点返回。例如:

import re

for line in response.iter_lines(1):
    matches = re.findall(r'\"bid\"\:\s(\d*\.\d*)', line)
    if len(matches) > 0:
        print float(matches[0])

事实证明,这非常简单,我通过将“demo”功能替换为以下内容来修复它:

def demo(displayHeartbeat):
    response = connect_to_stream()
    if response.status_code != 200:
        print response.text
        return
    for line in response.iter_lines(1):
        if line:
            try:
                msg = json.loads(line)
            except Exception as e:
                print "Caught exception when converting message into json\n" + str(e)
                return

            if displayHeartbeat:
                print line
            else:
                if msg.has_key("instrument") or msg.has_key("tick"):
                    print msg["tick"]["ask"] - .001
                    instrument = msg["tick"]["instrument"]
                    time = msg["tick"]["time"]
                    bid = msg["tick"]["bid"]
                    ask = msg["tick"]["ask"]

JSON对象可能包含换行符,因此无法单独解析每一行。出于流式传输的目的,您可能需要查看另一个检测JSON对象结尾的解码器。或者自己写一个;JSON有一个简单的状态模型。我认为你是对的,但是,我无法让它工作。我在一些地方添加了代码,当我让它运行时,它仍然输出原始的JSON。有什么想法吗?顺便谢谢你的帮助!我同意,但是oanda提供的代码将与他们的API一起使用,所以他们需要的东西一定有。。感谢您的帮助,现在我得到了这个错误“在将消息转换为json预期对象时捕获异常:第1行第1列(字符0)”,尽管如此!因此,我认为iter_内容的问题在于,您需要一个固定的块大小,而您的JSON似乎并不总是一个固定的大小?我将在最后一次尝试中编辑1,然后我放弃。谢谢Carson,我真的很感谢你的帮助。我收到后就把它寄出去
def demo(displayHeartbeat):
    response = connect_to_stream()
    if response.status_code != 200:
        print response.text
        return
    for line in response.iter_lines(1):
        if line:
            try:
                msg = json.loads(line)
            except Exception as e:
                print "Caught exception when converting message into json\n" + str(e)
                return

            if displayHeartbeat:
                print line
            else:
                if msg.has_key("instrument") or msg.has_key("tick"):
                    print msg["tick"]["ask"] - .001
                    instrument = msg["tick"]["instrument"]
                    time = msg["tick"]["time"]
                    bid = msg["tick"]["bid"]
                    ask = msg["tick"]["ask"]