Python 在函数循环中追加JSON

Python 在函数循环中追加JSON,python,json,Python,Json,我正在使用MQTT从传感器检索数据,并且我正在使用它来能够在传感器启动的时间工作。然后我尝试将其编写为JSON。 目前我遇到的问题是,每次它都会用新数据附加JSON,但它也会添加相同的标题 我使用的代码是python和当前脚本,用于在一个无限循环的函数中写入JSON def on_message(client, userdata, msg): if sensone > 0.275 and sensone < 0.315 and c == 0:

我正在使用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()
预期输出:

{
    "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
            }
        ]
    }

非常感谢您提供的任何帮助。

您实际上是在使用append标记(
“a”
)打开文件,因此它会将您在使用
json.dump()时写入的内容追加到您的文件中。

为了防止这种情况发生,首先使用
打开('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的现有字典/内容。

此处键入
和open(SensorTimes.JSON','a')
=>
和open('SensorTimes.JSON','a'))
你有没有一个例子来说明所有这些是如何工作的?我刚才给了你一个例子。你不需要在文件中添加当前的json,而是完全覆盖它