2017-01-03 37 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