У меня есть функция, которая отображает данные на графике, полученном с веб-сайта, эти данные сериализуются в словарях и сохраняются в файл с именем «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
Я ожидал, что результат будет сохранен и значение будет нанесено на график.