У меня есть каталог со многими маринованными файлами, каждый из которых содержит словарь. Имя файла указывает на настройку словаря. Например: 20NewsGroup___10___Norm-False___Probs-True___euclidean.pickle.
Я хочу объединить эти разные словари в один большой словарь. Для этого я написал следующий код:
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
Однако, когда я запускаю это, я получаю KeyError, так как ключ для splitted[0] еще не существует. Каков наилучший способ заполнить словарь, подобный тому, что я себе представляю?
Спасибо, Шива, с ответом в этом посте информация о настройках теряется.
Вам нужно создать в этих полях
Пример:
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
Вы можете использовать блоки try-except:
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]
try:
one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict
except KeyError:
one_dict[splitted[0]] = {}
one_dict[splitted[0]][splitted[1]] = {}
one_dict[splitted[0]][splitted[1]][splitted[2]] = {}
one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]] = {}
one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict
Этот код пытается получить доступ к вложенным ключам словаря, если они не существуют, код создаст их с пустым словарем.
Пожалуйста, проверьте свое решение для all_dicts = {"20NewsGroup___10___Norm-False___Probs-True___euclidean.pickle", "20NewsGroup___20___Norm-False___Probs-True___euclidean.pickle"}
Вы проверили это? stackoverflow.com/questions/30864702/… вы можете перебирать файлы каталогов и комбинировать