Python - CSV в JSON - вложенный - PullRequest
       18

Python - CSV в JSON - вложенный

0 голосов
/ 21 ноября 2019

У меня есть этот CSV:

product_id, width, height
14866, 200, 200
14866, 300, 300

Я использую импорт CSV и JSON, чтобы попытаться создать JSON, чтобы сделать запрос API.

Вот так выглядит мой питон прямо сейчас:

import csv
import json


json_dict = {}
results = []
with open('sizes.csv',encoding='utf-8-sig') as f:
   for row in csv.DictReader(f,):
        results.append(
            {'id': int(row['product_id']),
             'product': 
             {'product_creative_size_attributes':[{'width':str(row['width']),'height': str(row['height'])}]}})

json_dict["sizes"] = results

output_json = print(json.dumps(json_dict,indent=4))

Что приводит к этому json:

{
    "sizes": [
        {
            "id": 14866,
            "product": {
                "product_creative_size_attributes": [
                    {
                        "width": "200",
                        "height": "200"
                    }
                ]
            }
        },
        {
            "id": 14866,
            "product": {
                "gam_product_creative_size_attributes": [
                    {
                        "width": "300",
                        "height": "300"
                    }
                ]
            }
        }
    ]
}

json, которого я пытаюсь достичь,чтобы иметь размеры для одного и того же product_id, который будет вложен так:

{
    "sizes": [
        {
            "id": 14866,
            "product": {
                "product_creative_size_attributes": [
                    {
                        "width": "200",
                        "height": "200"
                    },
                    {
                        "width": "300",
                        "height": "300"
                    }
                ]
            }
        }
    ]
}

Ответы [ 2 ]

2 голосов
/ 21 ноября 2019

Сначала я бы сгруппировал идентификаторы продуктов с collections.defaultdict списками, а затем собрал окончательный словарь и сериализовал его в JSON.

Демонстрация:

from csv import DictReader
from collections import defaultdict
from json import dumps

result = {}
products = defaultdict(list)

with open("sizes.csv") as f:

    # make sure headers don't have whitespace, since they are used as dict keys later
    header = [h.strip() for h in next(f).split(",")]

    for row in DictReader(f, fieldnames=header):
        products[int(row["product_id"])].append(
            {"width": int(row["width"].strip()), "height": int(row["height"].strip())}
        )

# transform your grouped products into your desired result
result["sizes"] = [
    {"id": k, "product": {"product_creative_size_attributes": v}}
    for k, v in products.items()
]

output_json = dumps(result, indent=4)

print(output_json)

Выход:

{
    "sizes": [
        {
            "id": 14866,
            "product": {
                "product_creative_size_attributes": [
                    {
                        "width": 200,
                        "height": 200
                    },
                    {
                        "width": 300,
                        "height": 300
                    }
                ]
            }
        }
    ]
}
0 голосов
/ 21 ноября 2019
import csv
import json

k_product_id  = 0
k_width       = 1
k_height      = 2
json_dict     = {}
results       = []

with open('sizes.csv', encoding='utf-8-sig') as f:
  reader = csv.reader(f)
  # Avoid header
  next(reader, None)
  for row in reader:
    # Find index of existing product id
    existing_id = list(i for i,v in enumerate(results) if v['id'] == int(row[k_product_id]))

    # If there is no existing product id
    if not existing_id:
      results.append(\
                      {\
                        "id": int(row[k_product_id]),\
                        "product":\
                        {\
                          "product_creative_size_attributes":\
                            [\
                              {\
                                "width": int(row[k_width]),\
                                "height": int(row[k_height])\
                              }\
                            ]\
                        }\
                      }\
                    )
    # If there is existing product id
    else:
      results[existing_id[0]]['product']['product_creative_size_attributes']\
        .append(\
                  {\
                    "width": int(row[k_width]),\
                    "height": int(row[k_height])\
                  }\
               )

json_dict['sizes'] = results
output_json = json.dumps(json_dict, indent=4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...