Search code examples
pythondictionarypicklekeyerror

Add values to unexisting keys in dictionary


I have a directory with many pickled files, each containing a dictionary. The filename indicates the setting of the dictionary. E.g.: 20NewsGroup___10___Norm-False___Probs-True___euclidean.pickle.

I want to combine these different dicts all in one large dict. To do this, I have written the following code:

PATH = '<SOME PATH>'
all_dicts = os.listdir(PATH)

one_dict = dict()

for i, filename in enumerate(all_dicts):
    infile = open(PATH+filename, 'rb')
    new_dict = pickle.load(infile)
    infile.close()
    splitted = filename.split('___')
    splitted[4] = splitted[4].split('.')[0]
    one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict

However, when I run this, I get a KeyError, as the key for splitted[0] does not yet exist. What is the best way to populate a dictionary similar to what I envision?


Solution

  • you need to create in these fields

    Example:

    from typing import List
    
    PATH = '<SOME PATH>'
    all_dicts = os.listdir(PATH)
    
    def check_exist_path(target_dict, paths: List[str]):
         for key in paths:
              if key not in target_dict:
                   target_dict[key] = {}
    
              target_dict = target_dict[key]
    
    one_dict = dict()
    
    for i, filename in enumerate(all_dicts):
        infile = open(PATH+filename, 'rb')
        new_dict = pickle.load(infile)
        infile.close()
        splitted = filename.split('___')
        splitted[4] = splitted[4].split('.')[0]
    
        for i in range(5):
            check_exist_path(one_dict, [splitted[j] for j in range(i)])
    
        one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict