Разделить JSON на равные части с помощью Python
У меня есть большой json вида {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4',....etc} Мне нужно его разделить на равные части по 2 пары ключ-значение и положить их в разные файлы (т.е. файл1 - 'key1': 'value1', 'key2': 'value2', файл2 - 'key3': 'value3', 'key4': 'value4').
Код ниже работает, но записывает в файл только ключи, т.е. на выходе ["key1", "key2"]. Как записывать парами ключ-значение? И желательно в фигурных {}, а не квадратных скобках.
import json
from itertools import zip_longest
dashboard_lists = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4'}
def grouper(iterable, n, fillvalue=''):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
print(args)
return zip_longest(fillvalue=fillvalue, *args)
#print(type(dashboard_lists))
for i, group in enumerate(grouper(dashboard_lists, 2)):
#print(group)
with open('path_{}.json'.format(i), 'w') as outputfile:
json.dump(list(group), outputfile)
Ответы (2 шт):
Ваша функция на выходе выдает список кортежей из ключей, разбитых по 2, плюс в конце еще и добавляется (' ') если ключей нечетное количество.
Зачем так сложно.
Используйте другую функцию для деления на части вашего словаря
import json
dashboard_lists = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4', 'key5': 'value5'}
def dict_chunks(dict_of, n):
keys = list(dict_of.keys())
for i in range(0, len(keys), n):
yield {k: dict_of[k] for k in keys[i: i + n]}
Потом можете пройтись по тому же циклу, что у вас уже есть, только из dump уберите list
json.dump(group, outputfile)
В файл не записывал, но если посмотреть что получается на выходе этого цикла с применением функции, что выше, то видим следующее
{"key1": "value1", "key2": "value2"}
{"key3": "value3", "key4": "value4"}
{"key5": "value5"}
Нашел другой способ решить эту проблему:
from typing import List, Dict
res: List[Dict] = []
tmp_res: Dict = {}
for k, v in dashboard_lists.items():
tmp_res[k] = v
if len(tmp_res.keys()) > 2:
res.append(copy.deepcopy(tmp_res))
tmp_res = {}
if tmp_res:
res.append(copy.deepcopy(tmp_res))
i = 0
for it in res:
i += 1
with open('paths_{}.js'.format(i), 'w', encoding='utf-8') as outputfile:
json.dump(it, outputfile, ensure_ascii=False)