猿问

使用列表生成json布局

我正在尝试构建 JSON 布局。我正在从输入文件中读取所有这些记录。文件中可能有多个具有相同键(Id)的记录。


示例输入文件:


Id,LineNo,Amt,ReceivedDt,FromDt,ToDate,regionId

123545,1,1000.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA12

123545,2,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA12

123545,3,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA12

123546,1,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA13

123546,2,200.00,2019-02-01T00:00:00,2019-02-01T00:00:00,2019-02-01T00:00:00,WA13

我的逻辑是以字典格式从文件中读取记录并继续将其附加到列表中,直到相同的键(Id)匹配为止。如果键停止匹配,则删除列表并附加新键,然后将记录与此新键进行比较。在两者之间,需要存储结果,以便我不会丢失以前处理过的记录。(这是我无法弄清楚的)。


代码 :


import json,csv


with 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"

        }

    ]

}


慕田峪7331174
浏览 171回答 2
2回答

芜湖不芜

使用itertools.groupby:import csvimport jsonimport itertoolsimport operatorwith 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)

慕森卡

虽然不像 using 那样简洁优雅itertools.groupby,但这是一种方法,它涉及手动跟踪具有相同 的数据组Id:import csvimport jsonwith 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"            }        ]    }]
随时随地看视频慕课网APP

相关分类

Python
我要回答