【问题标题】:How to convert CSV to JSON using Python?如何使用 Python 将 CSV 转换为 JSON?
【发布时间】:2019-04-18 05:35:57
【问题描述】:

我需要使用下面指定的 python 脚本将 data.csv 文件转换为“ExpectedJsonFile.json”文件。但我无法做到这一点。 Python脚本“csvjs.py”指定如下。

import pandas as pd
from itertools import groupby
from collections import OrderedDict
import json

df = pd.read_csv('data8.csv', dtype={
            "Source" : str,
            "Template": str,
            "ConfigurationSetName": str,
       })

 results = []

for (Source, Template, ConfigurationSetName), bag in df.groupby      (["Source", "Template", "ConfigurationSetName"]):
   contents_df = bag.drop(["Source", "Template", "ConfigurationSetName"], axis=1)
Destinations = [OrderedDict(row) for i,row in contents_df.iterrows()]
results.append(OrderedDict([("Source", Source),
                            ("Template", Template),
                            ("ConfigurationSetName", ConfigurationSetName),
                            ("Destinations", Destinations)]))

print json.dumps(results[0], indent=4)
with open('ExpectedJsonFile.json', 'w') as outfile:
    outfile.write(json.dumps(results[0], indent=4))

data.csv 中的数据如下所示。

 Source,Template,ConfigurationSetName,ToAddresses,ReplacementTemplateData
 demo@example.com,MyTemplate,noreply,customer1@gmail.com,customer1
 demo@example.com,MyTemplate,noreply,customer2@gmail.com,customer2

当我运行“python csvjs.py”时,输出如下所示

{
    "Source": "demo@example.com",
    "Template": "MyTemplate",
    "ConfigurationSetName": "noreply",
    "Destinations": [
        {
            "ToAddresses": "customer1@gmail.com",
            "ReplacementTemplateData": "customer"
        },
        {
            "ToAddresses": "customer2@gmail.com",
            "ReplacementTemplateData": "customer2"
        }
    ]
}

但我的预期输出如下

{
  "Source":"demo@example.com",
  "Template":"MyTemplate",
  "ConfigurationSetName": "noreply",
  "Destinations":[
    {
      "Destination":{
        "ToAddresses":[
        "customer1@gmail.com"
       ]
    },
      "ReplacementTemplateData":"{ \"name\":\"customer1\" }"
    },
    {
      "Destination":{ 
        "ToAddresses":[
        "customer2@gmail.com"
       ]
    },
     "ReplacementTemplateData":"{ \"name\":\"customer2\" }"
    },
    {
      "Destination":{
       "ToAddresses":[
       "customer3@gmail.com"
     ]
    },
  "ReplacementTemplateData":"{}"
 }
 ],
 "DefaultTemplateData":"{ \"name\":\"friend\" }"
}

我的模板如下所示

{
  "Template": {
  "TemplateName": "MyTemplate",
  "SubjectPart": "Greetings, {{Name}}!",
  "HtmlPart": "<h1>Hello {{Name}},</h1><p>Your favorite animal is cat.</p>",
  "TextPart": "Dear {{Name}},\r\nYour favorite animal is cat."
  }
}

【问题讨论】:

  • 您真的需要这个"Destination":{ 密钥吗?看起来就像外部数组中的噪音
  • 是的,我需要那个
  • 好的,我建议重写Destinations = [OrderedDict(row) 行,这样您就可以在JSON 中实际创建中间Destination 对象,因此ToAddresses 可以成为列表而不是字符串跨度>

标签: python json pandas csv


【解决方案1】:

我通过更改此行代码部分成功

contents_df = bag.drop(["Source", "Template", "ConfigurationSetName", "ToAddresses", "ReplacementTemplateData"], axis=1)

现在产生的输出看起来像这样。

{
  "Source":"demo@example.com",
  "Template":"MyTemplate",
  "ConfigurationSetName": "noreply",
  "Destinations":[
{
  "Destination":{
    "ToAddresses":"customer1@gmail.com"
   }
 },
 {
   "Destination":{ 
    "ToAddresses":"customer2@gmail.com"
        }
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 2018-01-04
    • 2019-02-23
    • 2021-09-01
    • 2021-12-03
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多