如何在Python中将数据附加到嵌套的JSON文件

时间:2019-01-17 10:19:48

标签: python json

我正在创建一个程序,该程序需要将不同的对象以逻辑结构存储在文件上,该文件将由Web服务器读取并显示给用户。

由于文件将包含很多信息,因此,如某些答案所述,将整个文件加载到内存中,附加信息并将整个文件写回到文件系统将被证明是有问题的。 我正在寻找这种东西:

foods = [{
"fruits":{
    "apple":"red",
    "banana":"yellow",
    "kiwi":"green"
}
"vegetables":{
    "cucumber":"green",
    "tomato":"red",
    "lettuce":"green"
}
}]

我希望能够向表中添加其他数据,如下所示:

newFruit = {"cherry":"red"}
foods["fruits"].append(newFruit)

有什么办法可以在JSON中使用python来执行此操作而不加载整个文件吗?

2 个答案:

答案 0 :(得分:1)

使用纯JSON是不可能的,附加到JSON列表将始终需要将整个文件读入内存。

但是您可以使用JSON Lines。这种格式是有效JSON中的每一行本身,这就是AWS用于其API的方式。您的vegetables.json可以这样写:

{"cucumber":"green"}
{"tomato":"red"}
{"lettuce":"green"}

因此,添加新条目非常容易,因为它只是将新条目添加到文件末尾。

答案 1 :(得分:0)

  

由于该文件将包含大量信息,因此,将整个文件加载到内存中,附加信息并将整个文件写回到文件系统(如某些答案所述)将被证明是有问题的

如果您的文件太大而无法容纳在内存中,则源json应该已经拆分为较小的独立部分,或者这不是json的正确用例。 IOW在这种情况下,您遇到的是设计问题,而不是编码问题。

根据源数据结构和有效的更新,至少有一个streaming json parser可能会或不能来解决该问题。

这就是说,在当今的计算机中,您需要一个非常庞大的json文件来结束所有的ram,因此在进行其他操作之前,您应该只检查有效的文件大小以及需要将其解析为Python的内存量。