Добавление JSON в функциональный цикл

Я получаю данные с датчиков с помощью 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
            }
        ]
    }

Любая помощь в этом приветствуется.

Здесь опечатка with open(SensorTimes.json', 'a') => with open('SensorTimes.json', 'a')

Nenri 28.03.2019 10:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
471
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы фактически открываете свой файл с тегом добавления ("a"), поэтому он добавляет к вашему файлу содержимое, которое вы записываете в него, когда используете json.dump()

Чтобы предотвратить это, сначала прочитайте свой файл с помощью open('SensorTimes.json', 'r').read(), чтобы получить его содержимое. Затем переведите его в json. Затем добавьте к этому json новый контент. И запишите его в свой файл, используя open('SensorTimes.json', 'w').write(newJson) или json.dump(newJson, open('SensorTimes.json', 'w'))

Вы также можете открыть свой файл напрямую, чтобы читать и писать в него, используя тег "r+".

У вас есть пример того, как все это будет работать?

JackU 28.03.2019 10:40

Я только что дал вам.

Nenri 28.03.2019 11:07
Ответ принят как подходящий

Перепробовав много разных комбинаций, у меня получилось!

Я поместил добавление 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 в файл, а полностью перезаписываете его

Nenri 28.03.2019 11:07

Другие вопросы по теме