json.dump无法正确保存json对象

时间:2019-03-23 21:08:41

标签: python json matplotlib

我有一个函数,可以在从网站上获取的图表上绘制数据,该数据在字典中序列化并保存到名为“ data.json”的文件中。保存第一个词典时没有任何未解决的问题,但是第二个词典准确地保存了除最新条目外的所有条目。

我尝试过以不同的方式保存数据,所有这些都导致相同的问题。在经过相当长的时间上网浏览之后,我将其范围缩小到save_data()函数,我仍然陷入僵局。

这是save_data函数:

def save_data():
    with open('./data.json', 'w') as data_file:
        json_object = {
            "sig_count_diff": {},
            "total_sig_count": {}
        }

        for key, value in total_signature_count.items():
            # print("For signature_count_difference: Key: " + str(key) + " Value: " + str(value))
            json_object["total_sig_count"].update({str(key): value})

        for key1, value1 in signature_count_difference.items():
            # print("For signature_count_difference: Key1: " + str(key1) + " Value1: " + str(value1))
            json_object["sig_count_diff"].update({str(key1): value1})


        print(json_object)
        json.dump(json_object, data_file)

这是动画功能:

def animate(i):
    raw_data = request.urlopen('https://petition.parliament.uk/petitions/241584.json').read()
    json_data = json.loads(raw_data)
    signature_count = json_data["data"]["attributes"]["signature_count"]
    last_updated = parser.parse(json_data["data"]["attributes"]["updated_at"])

    print("Last Updated: " + str(last_updated))
    ax1.clear()

    if len(total_signature_count) >= 1:
        last_sig_key = total_signature_count[list(total_signature_count.keys())[-1]]

        if last_sig_key == last_updated:
            return

        last_signature_count = total_signature_count[list(total_signature_count.keys())[-1]]
        difference = signature_count - last_signature_count

        if (difference > 0):
            print("Difference: " + str(difference) + " Last Signature Count: " + str(last_signature_count) + " Signature Count: " + str(signature_count))
        signature_count_difference.update({last_updated: difference})
        print(signature_count_difference)
        ax1.plot(signature_count_difference.keys(), signature_count_difference.values(), label="Unique Signatures")
        print(signature_count_difference)

    total_signature_count.update({last_updated: signature_count})
    save_data()
    ax1.plot(total_signature_count.keys(), total_signature_count.values(), label="Total Signature Count")

这是控制台日志的一个片段:

Last Updated: 2019-03-23 20:49:37.538000+00:00
{datetime.datetime(2019, 3, 23, 20, 41, 38, 520000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 45, 38, 572000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 49, 37, 538000, tzinfo=tzutc()): 0}
{datetime.datetime(2019, 3, 23, 20, 41, 38, 520000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 45, 38, 572000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 49, 37, 538000, tzinfo=tzutc()): 0}
{'sig_count_diff': {'2019-03-23 20:41:38.520000+00:00': 0, '2019-03-23 20:45:38.572000+00:00': 0, '2019-03-23 20:49:37.538000+00:00': 0}, 'total_sig_count': {'2019-03-23 20:41:38.520000+00:00': 4648091, '2019-03-23 20:45:38.572000+00:00': 4651211, '2019-03-23 20:49:37.538000+00:00': 4654220}}
Last Updated: 2019-03-23 20:53:36.186000+00:00
=======> Difference: 3000 Last Signature Count: 4654220 Signature Count: 4657220
=== (signature_count_difference dict before it is saved)> {datetime.datetime(2019, 3, 23, 20, 41, 38, 520000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 45, 38, 572000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 49, 37, 538000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 53, 36, 186000, tzinfo=tzutc()): 3000}
{datetime.datetime(2019, 3, 23, 20, 41, 38, 520000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 45, 38, 572000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 49, 37, 538000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 53, 36, 186000, tzinfo=tzutc()): 3000}
=== (The JSON object supposedly saved)> {'sig_count_diff': {'2019-03-23 20:41:38.520000+00:00': 0, '2019-03-23 20:45:38.572000+00:00': 0, '2019-03-23 20:49:37.538000+00:00': 0, '2019-03-23 20:53:36.186000+00:00': 3000}, 'total_sig_count': {'2019-03-23 20:41:38.520000+00:00': 4648091, '2019-03-23 20:45:38.572000+00:00': 4651211, '2019-03-23 20:49:37.538000+00:00': 4654220, '2019-03-23 20:53:36.186000+00:00': 4657220}}
Last Updated: 2019-03-23 20:53:36.186000+00:00
=== (The next iteration of animate, difference. The difference value (3000) doesn't seem to have been saved) >{datetime.datetime(2019, 3, 23, 20, 41, 38, 520000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 45, 38, 572000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 49, 37, 538000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 53, 36, 186000, tzinfo=tzutc()): 0}
{datetime.datetime(2019, 3, 23, 20, 41, 38, 520000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 45, 38, 572000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 49, 37, 538000, tzinfo=tzutc()): 0, datetime.datetime(2019, 3, 23, 20, 53, 36, 186000, tzinfo=tzutc()): 0}
=== (JSON object of the next iteration, no entry with the value '3000' to be seen) > {'sig_count_diff': {'2019-03-23 20:41:38.520000+00:00': 0, '2019-03-23 20:45:38.572000+00:00': 0, '2019-03-23 20:49:37.538000+00:00': 0, '2019-03-23 20:53:36.186000+00:00': 0}, 'total_sig_count': {'2019-03-23 20:41:38.520000+00:00': 4648091, '2019-03-23 20:45:38.572000+00:00': 4651211, '2019-03-23 20:49:37.538000+00:00': 4654220, '2019-03-23 20:53:36.186000+00:00': 4657220}}
Last Updated: 2019-03-23 20:53:36.186000+00:00

我希望结果可以保存并在图表上绘制出值。

2 个答案:

答案 0 :(得分:0)

字典只能包含一次给定密钥。如果您用字典中已经存在的键调用.update({key: val}),它将替换旧值。

您似乎多次获取日期字符串键'2019-03-23 20:53:36.186000+00:00',并且在更新字典时,失去了其原始值3000。

答案 1 :(得分:0)

啊,我知道了这个问题。我一个愚蠢的错误。差异是由最后一个输入值和当前输入值计算得出的,但是它们都与我尝试将当前签名值放入与我用来提取最新签名的字典相同的字典中后计算出的差异相同值插入其中。

昨晚我没有逻辑地思考!

原谅缺乏线性思维的人, 谢谢!