2017-01-03 22 views
0

我试图用问题中的关键字搜索这个特定问题,但找不到一个好的解决方案。Python - 结合n个不同的json文件/字典(n可能有所不同)

说我有JSON文件列表(让我们假设顶层始终将是一个字典):

"../data/Flickr_EXIF_0.json", 
"../data/Flickr_EXIF_150.json", 
"../data/Flickr_EXIF_300.json", 
"../data/Flickr_EXIF_450.json", 

的问题是合并/合并所有JSON文件合并成一个单一的文件。

这将是当然简单的事,鉴于我们知道我们有多少JSON文件合并一样,

with open("../data/Flickr_EXIF_0.json", "r") as jFl: 
    obj1 = json.load(jFl) 

with open("../data/Flickr_EXIF_150.json", "r") as jFl: 
    obj2 = json.load(jFl) 

with open("../data/Flickr_EXIF_300.json", "r") as jFl: 
    obj3 = json.load(jFl) 

with open("../data/Flickr_EXIF_450.json", "r") as jFl: 
    obj4 = json.load(jFl) 

d = {**obj1, **obj2, **obj3, **obj4} 

你怎么会说写,可以结合未知数量JSONs的功能。我正在寻找pythonic解决方案。

这是我的部分解决方案,其会引发错误:

def appendJSON(*inpFl): 
    flObjs = [] 
    for fl in inpFl: 
     with open(fl, "r") as jFl: 
      flObjs.append(json.load(jFl)) 

    # something smart here! 
    itemsList = [list(objs.items()) for objs in flObjs] 

    return dict(itemsList) 

错误:itemsList

ValueError Traceback (most recent call last) in() 20 "../data/Flickr_EXIF_1350.json", 21 "../data/Flickr_EXIF_1500.json", ---> 22 "../data/Flickr_EXIF_1650.json")

in appendJSON(*inpFl) 7 itemsList = [objs.items() for objs in flObjs] 8 ----> 9 return dict(itemsList) 10 11 objs = appendJSON("../data/Flickr_EXIF_0.json",

ValueError: dictionary update sequence element #0 has length 150; 2 is required

样品调试值:

[[('5822864395', 
    {'date': '2010-06-10 14:48:25', 
    'height': 2592, 
    'lat': 0.0, 
    'long': 0.0, 
    'orientation': 0, 
    'width': 2818}), 
    ('1458886548', 
    {'date': '2007-09-22 02:59:20', 
    'height': 768, 
    'lat': 39.145372, 
    'long': -84.508981, 
    'orientation': 0, 
    'width': 1024})]] 

备用溶液,

def appendJSON(*inpFl): 
    flObjs = [] 
    for fl in inpFl: 
     with open(fl, "r") as jFl: 
      flObjs.append(json.load(jFl)) 

    for i in range(1,len(flObjs)): 
     flObjs[0].update(flObjs[i]) 

    return flObjs[0] 
+0

你打算跟我们分享这个错误吗? –

+0

哦,当然。对于那个很抱歉! @DanFarrell –

+1

谢谢。你为什么试图把一系列的字典变成字典?你如何期待这个工作,到底如何? –

回答

2

我会先做一个通用的解决方案,然后可以选择优化,如果JSON文件的顶级类型都是相同的(即,所有对象/字典,或所有数组/列表)。

如果你有顶级类型的负载(字典,列表值)后的混合,你不会是能够将它们结合起来反正。如果每个加载的数据都是字典或者每个加载的都是列表,则只能将它们组合。如果你有一个组合,或者如果你在顶层有一个或多个值,你不能合并。

通用的方法是有创造的json.load()加载到一个空列表和.append()数据,同时保持有,字典,列表或值的轨迹:

def combine(json_file_names): 
    combined = [] 
    have_dict = False 
    have_list = False 
    for file_name in json_file_names: 
     data = json.load(file_name) 
     combined.append(data) 
     if isinstance(data, dict): 
      have_dict = True 
     elif isinstance(data, list): 
      have_list = True 
     else: 
      have_list = have_dict = True 

    # if have_list and have_dict have the same value, either there is nothing 
    # loaded or it's a mixed bag. In both cases you can't do anything 
    if have_list == have_dict: 
     return combined 
    if have_list: 
     tmp = [] 
     for elem in combined: 
      tmp.extend(elem) 
    else: # have_dict 
     tmp = {} 
     for elem in combined: 
      tmp.update(elem) 
    return tmp 

请注意,梳理时清一色top-level-dicts可以覆盖先前加载的数据中的键值对。

0

由于JSON易于转换到Python字典,所有你需要做的是阅读所有的JSON文件到词典,合并所有字典,转换成JSON并将其保存到一个文件中。

+1

这可能是一条评论。 –

+1

如果将列表保存为JSON文件('json.dump([1,2,3])'),您将如何“轻松地将其转换为字典”?你只是将列表分配给一个随机密钥值? – Anthon

相关问题