Я получаю данные с датчиков с помощью MQTT, и я использую это, чтобы иметь возможность работать в то время, когда датчики были отключены. Затем я пытаюсь написать это в формате JSON.
В настоящее время у меня возникают проблемы, когда каждый раз, когда он добавляет JSON с новыми данными, он также добавляет тот же заголовок.
Код, который я использую, - это python и текущий скрипт для записи в JSON внутри функции, которая зацикливается на неопределенный срок.
def on_message(client, userdata, msg):
if sensone > 0.275 and sensone < 0.315 and c == 0:
print("Timer Started")
t0 = time.time()
dt0 = datetime.datetime.now()
dt0 = dt0.strftime('%Y-%m-%d %H:%M:%S')
c += 1
if senstwo > 0.275 and senstwo < 0.315 and c == 1:
t1 = time.time()
dt1 = datetime.datetime.now()
dt1 = dt1.strftime('%Y-%m-%d %H:%M:%S')
with open('SensorTimes.json', 'a') as outfile:
datalog = {}
datalog['SensorTimes'] = []
datalog['SensorTimes'].append({
"Start Time":dt0,
"End Time":dt1,
"Total Time":round(t1-t0, 2)
})
json.dump(datalog, outfile, indent=4)
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("172.18.65.123", 1883)
client.loop_forever()
Я удалил части сценария, которые не имеют отношения к делу, я поместил все это в оператор if, потому что, если он не находится в пределах, я не хочу, чтобы данные записывались.
Текущий выход:
{
"SensorTimes": [
{
"Start Time": "2019-03-28 09:03:10",
"End Time": "2019-03-28 09:03:12",
"Total Time": 2.22
}
]
}{
"SensorTimes": [
{
"Start Time": "2019-03-28 09:03:38",
"End Time": "2019-03-28 09:03:41",
"Total Time": 3.02
}
]
}
Ожидаемый результат:
{
"SensorTimes": [
{
"Start Time": "2019-03-28 09:03:10",
"End Time": "2019-03-28 09:03:12",
"Total Time": 2.22
},
{
"Start Time": "2019-03-28 09:03:38",
"End Time": "2019-03-28 09:03:41",
"Total Time": 3.02
}
]
}
Любая помощь в этом приветствуется.






Вы фактически открываете свой файл с тегом добавления ("a"), поэтому он добавляет к вашему файлу содержимое, которое вы записываете в него, когда используете json.dump()
Чтобы предотвратить это, сначала прочитайте свой файл с помощью open('SensorTimes.json', 'r').read(), чтобы получить его содержимое. Затем переведите его в json. Затем добавьте к этому json новый контент. И запишите его в свой файл, используя open('SensorTimes.json', 'w').write(newJson) или json.dump(newJson, open('SensorTimes.json', 'w'))
Вы также можете открыть свой файл напрямую, чтобы читать и писать в него, используя тег "r+".
У вас есть пример того, как все это будет работать?
Я только что дал вам.
Перепробовав много разных комбинаций, у меня получилось!
Я поместил добавление JSON в отдельную функцию, которая вызывается в операторе if, и это возвращает исходную функцию.
datalog = {}
datalog['SensorTimes'] = []
def json_update(dt1, t1, dt0, t0):
with open(r'SensorTimes.json', 'w') as outfile:
datalog['SensorTimes'].append({
"Start Time":dt0,
"End Time":dt1,
"Total Time":round(t1-t0, 2)
})
json.dump(datalog, outfile, indent=4)
return
Это дает ожидаемый результат и будет работать все время в неопределенной функции. Это добавляет новый словарь в JSON и не перезаписывает существующий словарь/содержимое JSON.
вы не добавляете текущий json в файл, а полностью перезаписываете его
Здесь опечатка
with open(SensorTimes.json', 'a')=>with open('SensorTimes.json', 'a')