Запись json-объектов без отступа
Задача состоит в переборе и присваивании новых "названий" в json таблицу, но проблема такова, что запись туда введется без отступа с каждой новой строкой, отчего все объекты вкладываются в друг друга. Требуется помощь по решению проблемы. Заранее спасибо.
# Открытие вышесозданного файла и чтение информации
with open('products.json', encoding='utf-8') as json_file:
products_catalog = json.load(json_file)
for products_catalog[0] in products_catalog:
category = products_catalog[0]['category']
name = products_catalog[0]['name']
brief_description = products_catalog[0]['part']
sku = products_catalog[0]['sku']
producer = products_catalog[0]['vendor']
weight = math.ceil(products_catalog[0]['weight'])
products_list = {
"category": category,
"name": name,
"briefdescription": brief_description,
"sku": sku,
"producer": producer,
"weight": weight
}
completed_data = json.dumps(products_list)
with open('products_catalog_parsed.json', 'a', encoding='utf-8') as products_catalog_parsedfile:
json.dump(products_list, products_catalog_parsedfile, indent=4, ensure_ascii=False)
Список из скриншота:
{
"category": 408,
"name": "Монитор AOC 24\" e2460Sh Black TN LED (2GTG)ms 16:9 DVI HDMI M/M 20M:1 250cd USB ",
"briefdescription": "E2460SH",
"sku": 527044,
"producer": "AOC",
"weight": 6
}{
"category": 406,
"name": "Монитор 19.5\" PHILIPS 203V5LSB26/62(10) Black (LED, LCD, Wide, 1600x900, 5 ms, 90°/50°, 200 cd/m, 10M:1)",
"briefdescription": "203V5LSB26/62(10)",
"sku": 531013,
"producer": "Philips",
"weight": 3
}{
"category": 466,
"name": "Чайник электрический Gorenje K10C 1л. 1630Вт белый (корпус: керамика)",
"briefdescription": "K10C",
"sku": 767181,
"producer": "Gorenje",
"weight": 2
}{
"category": 279,
"name": "Процессор CPU Intel Core i3-3220 Ivy Bridge OEM {3.3ГГц, 2х256КБ+3МБ, Socket1155}",
"briefdescription": "CM8063701137502SR0RG",
"sku": 155291,
"producer": "Intel",
"weight": 2
}{
"category": 328,
"name": "Видеокарта Gigabyte PCI-E GV-N210D3-1GI nVidia GeForce 210 1024Mb 64bit DDR3 590/1200 DVIx1/HDMIx1/CRTx1/HDCP Ret low profile",
"briefdescription": "GV-N210D3-1GI",
"sku": 565032,
"producer": "Gigabyte",
"weight": 1
}{
"category": 939,
"name": "Расходные материалы Kyocera-Mita 302HS94032 Узел Роликов подачи бумаги в сборе",
"briefdescription": "2HS94032",
"sku": 288086,
"producer": "Hewlett-Packard",
"weight": 1
}
Ответы (2 шт):
Автор решения: Andy Pavlov
→ Ссылка
Немного сократил Ваш код и добавил обработку текста на входе для принятия json.loads().
import json
with open('products.json', encoding='utf-8') as file:
raw = file.read()
formated = '[{}]'.format(raw.replace('}{', '},{'))
products_catalog = json.loads(formated)
keys = ['category', 'name', 'briefdescription', 'sku', 'producer', 'weight']
products_list = [{k: row.get(k, None) for k in keys} for row in products_catalog]
# Дальше оставил как есть
completed_data = json.dumps(products_list)
with open('products_catalog_parsed.json', 'a', encoding='utf-8') as products_catalog_parsedfile:
json.dump(products_list, products_catalog_parsedfile, indent=4, ensure_ascii=False)
Автор решения: empty
→ Ссылка
Короче я просто не стал заносить все данные в цикле с помощью append в файл, а занес их в list и потом готовый list вывел как один файл и все заработало.
