在Python中组合多个词典

时间:2016-02-25 05:28:30

标签: python json mongodb dictionary

我有一个12 GB的文件,其中每一行都是以下形式的JSON对象:

{
    "name": "abc", 
    "val1":500,
    "val2":30, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        }
           }
}

遗憾的是,对象结构无法更改。

假设我在此文件中有另一行:

{
    "name": "abc", 
    "val1":300,
    "val2":10, 
    "val3":{
               "topic2":{
                            "val4":["hello","world"],
                            "val5":["test"]
                        }
           }
}

我现在需要合并具有相同名称的对象,以便获得表单的对象:

{
    "name": "abc", 
    "val1":800,
    "val2":40, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        },
               "topic2":{
                            "val4":["hello","world"],
                            "val5":["test"]
                        }
           }
}

我正在逐行读取文件并在Python中加载每行的JSON对象。所以每一行基本上都变成了Python dict()。然后我将此对象存储在MongoDB集合中,如果文件中出现另一个具有相同名称的对象,我将更新Mongo记录,使其合并,如上例所示。

我试图遵循与Integrating multiple dictionaries in python (big data)中相同的方法,但我使用Mongodb来适应某些值的对象结构。但是,即使对于400 MB的样本文件,这也非常慢。

有没有办法更好地做到这一点,可能使用某种并行处理?

1 个答案:

答案 0 :(得分:0)

这段代码应该有所帮助。

# not tested
import json

mydict = {}
with open(myfile,'r') as infile:
    for line in infile:
        myline = json.loads(line)
        if myline['name'] in mydict:
            mydict[myline['name']]['val1'] += myline['val1']
            mydict[myline['name']]['val2'] += myline['val2']
            mydict[myline['name']]['val3'] += [myline['val3']]
        else:
            mydict[myline['name']] = myline
            mydict[myline['name']]['val3'] = [myline['val3']]

然而,你的问题确实很模糊,所以这是我对你要完成的事情的看法。

编辑:我只是连接字典,但您可以在.append(myline)发生的部分实现更复杂的合并逻辑。