修复JSON中的科学计数法

2024-10-03 17:19:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正致力于如何将JSON文件的输出从使用科学表示法更改为JSON dict中某些键的浮点值

例如,我需要这个:

{'message': '', 'result': [{'Ask': 8.982e-05, 'BaseVolume': 235.09663206, 'Bid': 8.9e-05, 'Created': '2017-06-06T01:22:35.727', 'High': 9.413e-05, 'Last': 8.878e-05, 'Low': 8.01e-05, 'MarketName': 'BTC-1ST', 'OpenBuyOrders': 408, 'OpenSellOrders': 6009, 'PrevDay': 8.375e-05, 'TimeStamp': '2017-09-27T02:17:44.677', 'Volume': 2678614.34426254},

看起来像这样:

{"success":true,"message":"","result":[{"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)

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


Tags: importjsonmessage科学resultasklowpprint
2条回答

也许,这会引起一些问题,但它们很容易解决。 你需要使用json.dumps文件()而不是json.loads()

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,\" ...

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

这些值已经被存储为float!您可以使用以下代码(根据您的代码修改)来查看:

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

所以,如果你想简单地打印出其中一个值,你必须像我的例子一样使用字符串格式,或者如果你想把这些值传递给另一个程序或函数,你不必改变任何东西,因为它们已经是浮动的!在

相关问题 更多 >