为了账号安全,请及时绑定邮箱和手机立即绑定

使用列表生成json布局

使用列表生成json布局

慕田峪7331174 2021-06-29 09:00:28
我正在尝试构建 JSON 布局。我正在从输入文件中读取所有这些记录。文件中可能有多个具有相同键(Id)的记录。示例输入文件:Id,LineNo,Amt,ReceivedDt,FromDt,ToDate,regionId123545,1,1000.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA12123545,2,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA12123545,3,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA12123546,1,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA13123546,2,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA13我的逻辑是以字典格式从文件中读取记录并继续将其附加到列表中,直到相同的键(Id)匹配为止。如果键停止匹配,则删除列表并附加新键,然后将记录与此新键进行比较。在两者之间,需要存储结果,以便我不会丢失以前处理过的记录。(这是我无法弄清楚的)。代码 :import json,csvwith open('Test.csv') as f:    inputfile = csv.DictReader(f)    output = []    key =1    for row in inputfile :        if len(output)==0:            output.append(row)        elif len(output)>0:            if row['Id']==key:                output.append(row)            else:                del output[:]                output.append(row)        key=row['Id']        data = json.dumps({"data":output}, indent=4)print(data)输出: 当第一组被删除时,只有最后两行出现。请建议如何存储这些行。{    "data": [        {            "ToDate": "2019-02-01T00:00:00",            "ReceivedDt": "2019-02-01T00:00:00",            "regionId": "WA13",            "Id": "123546",            "LineNo": "1",            "Amt": "200.00",            "FromDt": "2019-02-01T00:00:00"        },        {            "ToDate": "2019-02-01T00:00:00",            "ReceivedDt": "2019-02-01T00:00:00",            "regionId": "WA13",            "Id": "123546",            "LineNo": "2",            "Amt": "200.00",            "FromDt": "2019-02-01T00:00:00"        }    ]}
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

使用itertools.groupby:


import csv

import json

import itertools

import operator


with open('Test.csv') as f:

    cf = csv.DictReader(f)

    output = [{'data': list(rows)} 

        for id_, rows in itertools.groupby(cf, key=operator.itemgetter('Id'))]

data = json.dumps(output, indent=4)

print(data)


查看完整回答
反对 回复 2021-07-13
?
慕森卡

TA贡献1806条经验 获得超8个赞

虽然不像 using 那样简洁优雅itertools.groupby,但这是一种方法,它涉及手动跟踪具有相同 的数据组Id:


import csv

import json


with open('Test.csv') as f:

    output = []

    data = []

    key = None


    for row in csv.DictReader(f):

        if row['Id'] == key:

            data.append(row)

        else:

            if data:

                output.append({"data": data})

                data = []

            data.append(row)

            key = row['Id']


    if data:  # A final group?

        output.append({"data": data})


print('output:\n', json.dumps(output, indent=4))

输出:


output:

 [

    {

        "data": [

            {

                "Id": "123545",

                "LineNo": "1",

                "Amt": "1000.00",

                "ReceivedDt": "2019-02-01T00:00:00",

                "FromDt": "2019-02-01T00:00:00",

                "ToDate": "2019-02-01T00:00:00",

                "regionId": "WA12"

            },

            {

                "Id": "123545",

                "LineNo": "2",

                "Amt": "200.00",

                "ReceivedDt": "2019-02-01T00:00:00",

                "FromDt": "2019-02-01T00:00:00",

                "ToDate": "2019-02-01T00:00:00",

                "regionId": "WA12"

            },

            {

                "Id": "123545",

                "LineNo": "3",

                "Amt": "200.00",

                "ReceivedDt": "2019-02-01T00:00:00",

                "FromDt": "2019-02-01T00:00:00",

                "ToDate": "2019-02-01T00:00:00",

                "regionId": "WA12"

            }

        ]

    },

    {

        "data": [

            {

                "Id": "123546",

                "LineNo": "1",

                "Amt": "200.00",

                "ReceivedDt": "2019-02-01T00:00:00",

                "FromDt": "2019-02-01T00:00:00",

                "ToDate": "2019-02-01T00:00:00",

                "regionId": "WA13"

            },

            {

                "Id": "123546",

                "LineNo": "2",

                "Amt": "200.00",

                "ReceivedDt": "2019-02-01T00:00:00",

                "FromDt": "2019-02-01T00:00:00",

                "ToDate": "2019-02-01T00:00:00",

                "regionId": "WA13"

            }

        ]

    }

]


查看完整回答
反对 回复 2021-07-13
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信