我正在创建一个程序,该程序需要将不同的对象以逻辑结构存储在文件上,该文件将由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来执行此操作而不加载整个文件吗?
答案 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的内存量。