python - 将 csv 转换为 json(嵌套对象)

标签 python json

我是 python 的新手,我必须按以下格式将 csv 文件转换为 json:

CSV 文件:

firstname, lastname, email, customerid, dateadded, customerstatus
john, doe, john.doe@do.com, 124,26/11/18,active
jane, doe, jane.doe@do.com, 125,26/11/18,active

JSON 格式:
{
    firstname: "John",
    lastname: "Doe",
    emailOrPhone: "john.doe@do.com",
    extraFields: [{
            name: "customerid",
            value: "124"
        },
        {
            name: "dateadded",
            value: "26/11/18"
        },
        {
            name: "dateadded",
            value: "26/11/18"
        }
    ]
}, {
    firstname: "Jane",
    lastname: "Doe",
    emailOrPhone: "Jane.doe@do.com",
    extraFields: [{
            name: "customerid",
            value: "125"
        },
        {
            name: "dateadded",
            value: "26/11/18"
        },
        {
            name: "dateadded",
            value: "26/11/18"
        }
    ]
}


current code I am using:
import requests
import json
import time
import csv
import json
import glob
import os
import logging


for filename in glob.glob('D:\\api\\Extract.csv'):
    csvfile = os.path.splitext(filename)[0]
    jsonfile = csvfile + '.json'

    with open(csvfile+'.csv') as f:
        reader = csv.DictReader(f)
        rows = list(reader)

    with open(jsonfile, 'w') as f:
        json.dump(rows, f)

url = 'api_url'

with open("D:\\api\\Extract.json", "r") as read_file:
    data = json.load(read_file)

    for item in data:


        headers = {"Authorization" : "key", "Content-Type" : "application/json"}

        r = requests.post(url, data= json.dumps(item), headers= headers)



        logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(message)s',
                    handlers=[logging.FileHandler("D:\\api\\log_file.log"),
                              logging.StreamHandler()])

我可以在 json 中生成父值,但我不确定如何获取子节点并将列名解析为值并像这样遍历整个文件。
上面的代码将csv转换为简单的json对象,我想实现嵌套对象。我想也许追加将是解决方案,但不知道如何将列作为值和相应的数据作为值传递。

最佳答案

您可以使用 csv.DictReader 这使您可以在迭代每一行时访问列名。然后您可以按如下方式构建每个项目:

import json
import csv

primary_fields = ['firstname', 'lastname', 'email']
result = []
with open('mydata.csv') as csv_file:
    reader = csv.DictReader(csv_file, skipinitialspace=True)
    for row in reader:
        d = {k: v for k, v in row.items() if k in primary_fields}
        d['extraFields'] = [{'name': k, 'value': v} for k, v in row.items() if k not in primary_fields]
        result.append(d)

print(json.dumps(result, indent=2))

输出
[
  {
    "firstname": "john",
    "lastname": "doe",
    "email": "john.doe@do.com",
    "extraFields": [
      {
        "name": "customerid",
        "value": "124"
      },
      {
        "name": "dateadded",
        "value": "26/11/18"
      },
      {
        "name": "customerstatus",
        "value": "active"
      }
    ]
  },
  {
    "firstname": "jane",
    "lastname": "doe",
    "email": "jane.doe@do.com",
    "extraFields": [
      {
        "name": "customerid",
        "value": "125"
      },
      {
        "name": "dateadded",
        "value": "26/11/18"
      },
      {
        "name": "customerstatus",
        "value": "active"
      }
    ]
  }
]

如果您想在最终的 json 中设置自定义字段名称(例如 emailOrPhone 用于 email ),您始终可以手动为 d 设置字段名称并设置适当的值

关于python - 将 csv 转换为 json(嵌套对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53474118/

相关文章:

Python 在 dos 窗口中无法正确显示简体中文

json - Go lang 解码 io.read JSON 与 JSON解码给出不同的结果

python - JSON 架构 oneOf 验证问题

javascript - AngularJs。如何从json中获取对象信息

json - 在 jq 中组合并重新键入多个对象

jquery - 带注释的 Spring 2.5.x MVC portlet 和带有 jQ​​uery+JSON 的 AJAX 错误 : Content Type cant be set to json

Python 多处理 - 为什么使用 functools.partial 比默认参数慢?

python - 字典中的 "TypeError: ' unicode ' object does not support item assignment"

python - 打包 stub 文件

python - 设置布局的背景颜色