在Python中如何合并两个JSON字典?

10

我正在尝试合并两个JSON字典。目前我有一个JSON文件(myjfile.json),其内容如下:

{"cars": 1, "houses": 2, "schools": 3, "stores": 4}

此外,我在Python中有一个名为“mydict”的字典,它的结构如下所示:
{"Pens": 1, "Pencils": 2, "Paper": 3}

当我将它们结合起来时,它们是两个不同的词典。
with open('myfile.json' , 'a') as f:
  json.dump(mydict, f)

注意,在代码中,myfile.json 使用 'a' 和 /n 进行写入,因为我希望在每次写入时保留文件内容并开始新的一行。

我希望最终结果看起来像这样:

{"cars": 1, "houses": 2, "schools": 3, "stores": 4, "Pens": 1, "Pencils": 2, "Paper": 3}

你的字典中使用 a.update(b) 怎么样? - Anton Protopopov
你需要将JSON文件加载到内存中,应用更新,然后将其保存到文件中。这就是它的工作原理。 - Valijon
你所需要做的就是从文件中加载最后一行,并使用本地字典进行更新。请参考附带的解决方案。 - Spade
4个回答

18

如果您需要将两个字典合并成一个,您可以使用 update 方法:

a = {"cars": 1, "houses": 2, "schools": 3, "stores": 4}
b = {"Pens": 1, "Pencils": 2, "Paper": 3}

a.update(b)
print(a)

输出结果应该是这样的:
{'Paper': 3, 'cars': 1, 'Pens': 1, 'stores': 4, 'Pencils': 2, 'schools': 3, 'houses': 2}

要创建一个全新的dict而不影响a,你可以这样做:

out = dict(list(a.items()) + list(b.items()))

print(out)
{'Paper': 3, 'cars': 1, 'Pens': 1, 'stores': 4, 'Pencils': 2, 'schools': 3, 'houses': 2}

编辑

对于您的情况,您可以使用json.load加载您的json文件,然后使用json.dump更新它并保存:

mydict = {"Pens": 1, "Pencils": 2, "Paper": 3}
with open('myfile.json' , 'r+') as f:
   d = json.load(f)
   d.update(mydict)
   f.seek(0)
   json.dump(d, f)
   

我需要一个with open()语句吗? - jumpman8947
你首先需要读取你的JSON,然后更新它并将其写回。你可以将你的字典添加到已存在的文件中。或者你想要在第二行放置完整的字典吗? - Anton Protopopov
由于第一组数据(汽车、房屋等)早已生成为JSON格式,我只想将mydict附加到已生成的数据中。 - jumpman8947
它使用with open()语句生成第一组数据-myjsonfile.json,因此不确定在哪里添加更新,如果我在with open之外添加它,会得到对象没有属性更新的错误。 - jumpman8947

0

鉴于提问者的问题涉及包含JSON内容的文件,这个答案可能更好:

import json
import ast

myFile = 'myFile.json'
jsonString = lastLineofFile(myfile)
d = ast.literal_eval(jsonString) # from file

d.update(dict)
with open(myFile, 'a') as f:
    json.dump(d, f)

此外,由于这是增量式的,因此可以通过以下高效的辅助函数获取文件的最后一行:
# Read the last line of a file. Return 0 if not read in 'timeout' number of seconds
def lastLineOfFile(fileName, timeout = 1):
    elapsed_time = 0
    offset = 0 
    line = '' 
    start_time = time.time()

    with open(fileName) as f: 
        while True and elapsed_time < timeout: 
            offset -= 1 
            f.seek(offset, 2) 
            nextline = f.next() 

            if nextline == '\n' and line.strip(): 
                return line 
            else: 
                line = nextline

            elapsed_time = time.time() - start_time

    if elapsed_time >= timeout:
        return None

0
可以使用 JavaScript 中的类似于 扩展运算符 的东西来完成:
In [2]: a = {"cars": 1, "houses": 2, "schools": 3, "stores": 4}

In [3]: b = {"Pens": 1, "Pencils": 2, "Paper": 3}

In [4]: {**a, **b}
Out[4]:
{'cars': 1,
 'houses': 2,
 'schools': 3,
 'stores': 4,
 'Pens': 1,
 'Pencils': 2,
 'Paper': 3}

0

在 Anton 所说的基础上,您可以将 JSON 文件读入字典。之后像他一样使用 a.update(b) ,然后覆盖文件。

如果您打开文件进行附加,并像您所做的那样进行 JSON 转储,它只会创建带有新 JSON 数据的另一行。

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接