from IPython import embed from functools import reduce def read_info_file(file_name): """ Reads the info file and returns the stored metadata in a dictionary. The dictionary may be nested. @param file_name: The name of the info file. @return: dictionary, the stored information. """ root = {} with open(file_name, 'r') as f: lines = f.readlines() for l in lines: if not l.startswith("#"): continue l = l.strip("#").strip() if len(l) == 0: continue if not ": " in l: # subsection sec = {} root[l[:-1] if l.endswith(":") else l] = sec else: parts = l.split(': ') sec[parts[0].strip()] = parts[1].strip('"').strip() return root def find_key_recursive(dictionary, key, path=[]): assert(isinstance(dictionary, dict)) if key in dictionary.keys(): path.append(key) return True for k in dictionary.keys(): if isinstance(dictionary[k], dict): if find_key_recursive(dictionary[k], key, path): path.insert(-1, k) break return len(path) > 0 def deep_get(dictionary, keys, default=None): assert(isinstance(dictionary, dict)) assert(isinstance(keys, list)) return reduce(lambda d, key: d.get(key, default) if isinstance(d, dict) else default, keys, dictionary)