【问题标题】:Fixing scientific notation in json to float将 json 中的科学记数法固定为浮动
【发布时间】:2017-09-27 05:15:51
【问题描述】:

我目前正纠结于如何将 JSON 文件的输出从科学记数法更改为 JSON 字典中某些键的浮点数。

例如我需要这个:

{'消息': '', “结果”:[{“询问”:8.982e-05, 'BaseVolume':235.09663206, “出价”:8.9e-05, '创建':'2017-06-06T01:22:35.727', “高”:9.413e-05, “最后”:8.878e-05, “低”:8.01e-05, 'MarketName': 'BTC-1ST', 'OpenBuyOrders':408, 'OpenSellOrders': 6009, 'PrevDay': 8.375e-05, '时间戳':'2017-09-27T02:17:44.677', '卷':2678614.34426254},

看起来像这样:

{"success":true,"message":"","re​​sult":[{"MarketName":"BTC-1ST","High":0.00009413,"Low":0.00008010,"Volume":2678614.34426254 ,"Last":0.00008878,"BaseVolume":235.09663206,"TimeStamp":"2017-09-27T02:13:07.55","Bid":0.00008900,"Ask":0.00008982 ,"OpenBuyOrders":408,"OpenSellOrders":6009,"PrevDay":0.00008375,"Created":"2017-06-06T01:22:35.727"},

我当前的代码如下所示:

#!/usr/bin/python3

import urllib.request, json
from pprint import pprint
from json import encoder

encoder.FLOAT_REPR = lambda o: format(o, '.8f')
with urllib.request.urlopen("https://bittrex.com/api/v1.1/public/getmarketsummaries") as url:
    data = json.loads(url.read().decode())
    pprint (data)

即使我之前的问题被标记为已回答并且另一个问题的重复问题,这也不起作用。这个“重复”问题与科学记数法无关,也没有解决问题。

【问题讨论】:

  • 您正在使用 json 读取文件并使用 pprint 将其显示在控制台上。您似乎关心数据的显示方式,这将是 pprint 而不是 json 的属性。你的意思是问如何改变pprint中浮点值的默认格式?
  • 这是一个混淆地图为领土的案例;数据是浮点数,科学记数法是一种将浮点数表示为字符串的格式,它是 JSON 格式和 Python 的 float 函数可以将字符串解析为浮点值的允许表示形式。跨度>

标签: python json python-3.x


【解决方案1】:

也许,它会导致一些问题,但它们很容易解决。 你需要使用 json.dumps() 而不是 json.loads() Source

data = json.dumps(url.read().decode())

输出:

'"{\"success\":true,\"message\":\"\",\"result\":[{\"MarketName\":\"BTC-1ST\",\"High \":0.00009287,\"Low\":0.00008200,\"Volume\":1860886.81706592,\"Last\":0.00008800,\"BaseVolume\":163.34599977,\"TimeStamp\":\"2017-09-27T07 :54:48.62\",\"Bid\":0.00008800,\"Ask\":0.00008818,\"OpenBuyOrders\":401,\"OpenSellOrders\":6015,\" ...

【讨论】:

    【解决方案2】:

    这些值已经存储为浮点数!您可以使用以下代码(从您的代码修改)看到这一点:

    #!/usr/bin/python3
    
    import urllib.request, json
    from pprint import pprint
    from json import encoder
    
    encoder.FLOAT_REPR = lambda o: format(o, '.8f')
    with urllib.request.urlopen("https://bittrex.com/api/v1.1/public/getmarketsummaries") as url:
        data = json.loads(url.read().decode())
        # pprint (data)
        thing = list(filter(lambda x:x['MarketName']=='BTC-1ST', data['result']))[0]
        pprint(thing['Ask'])
        print('{:.10f}'.format(thing['Ask']))
        print(type(thing['Ask']))
    

    注意pprint 中的第一个值如何显示科学记数法(即该浮点值的默认字符串表示形式),而第二个显示它的格式类似于您想要的格式,强制它以这种方式显示。

    因此,如果您只想打印出其中一个值,则必须像我的示例中那样使用字符串格式,或者如果您想将这些值传递给另一个程序或函数,则不需要必须更改任何内容,因为它们已经是浮动的!

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2015-07-03
      相关资源
      最近更新 更多