修复json中的科学记数法浮动

时间:2017-09-27 05:15:52

标签: python json python-3.x

我目前仍然坚持如何将JSON文件的输出从科学记数法改为为JSON词典中的某些键设置浮点数。

例如我需要这个:

  

{'message':'',    '结果':[{ '问':8.982e-05,                'BaseVolume':235.09663206,                '出价':8.9e-05,                'Created':'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,                'TimeStamp':'2017-09-27T02:17:44.677',                '卷':2678614.34426254},

看起来像这样:

  

{ “成功”:真, “消息”: “”, “结果”:[{ “MarketName”: “BTC-1ST”, “高”:0.00009413, “低”:0.00008010, “音量”:2678614.34426254 “上次”:0.00008878, “BaseVolume”:235.09663206, “时间戳”: “2017-09-27T02:13:07.55”, “投标”:0.00008900, “问”:0.00008982 下, “OpenBuyOrders”:408, “OpenSellOrders”:6009, “PrevDay”:0.00008375, “创建”: “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)
即使我之前的问题被标记为已回答并且是另一个问题的重复问题,但该作品仍无效。这个“重复”的问题与科学记法无关,而且无法解决问题。

2 个答案:

答案 0 :(得分:1)

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

#!/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中的第一个值如何显示科学记数法(即该浮点值的默认字符串表示形式),而第二个值显示它的格式类似于您希望它强制显示该方式的方式

因此,如果您只想打印出其中一个值,那么您必须使用我的示例中的字符串格式,或者如果您想将这些值传递给另一个程序或函数,你不必改变任何东西,因为它们已经浮动了!

答案 1 :(得分:1)

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

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

输出:

  

“ ”{\“ 成功\ ”:真,\“ 消息\ ”:\“ \ ”\ “结果\”:[{\ “MarketName \”:\ “BTC-1ST \”,\“ 高\ “:0.00009287,\” 低\ “:0.00008200,\” 卷\ “:1860886.81706592,\” 上\ “:0.00008800,\” BaseVolume \ “:163.34599977,\” 时间戳\ “:\” 2017-09-27T07 :54:48.62 \ “\ ”投标\“:0.00008800,\ ”问\“:0.00008818,\ ”OpenBuyOrders \“ 401 \ ”OpenSellOrders \“:6015,\”   ...

因为,您知道您之前的问题被标记为重复。在指定的there解决方案中,作者使用了dumps()方法。