我目前仍然坚持如何将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)
即使我之前的问题被标记为已回答并且是另一个问题的重复问题,但该作品仍无效。这个“重复”的问题与科学记法无关,而且无法解决问题。
答案 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()方法。