简体   繁体   English

使用python将csv文件转换为嵌套嵌套的字典列表

[英]convert csv file to nested nested list of dictionaries using python

I'm trying to convert a csv file to nested json: I'm looking for json output something like this.我正在尝试将 csv 文件转换为嵌套的 json:我正在寻找类似这样的 json 输出。

here is my json data:这是我的 json 数据:

[
   {
      "RID":"test",
      "UId":"userl@gmail.com",
      "Ugroup":"abc",
      "Query":[
         {
            "Status":"query1",
            "ECategory":"error1"
         },
         {
            "Status":"query2",
            "ECategory":"error2"
         }
      ],
      "SuccesfulQ":"7",
      "FailedQ":"0"
   },
   {
      "RID":"test2",
      "Uld":"user2@gmail.com",
      "Ugroup":"xyz",
      "Query":[
         {
            "Statement":"query3",
            "ECategory":"error3"
         },
         {
            "Statement":"query4",
            "ECategory":"error4"
         }
      ],
      "SuccesfulQ":"7",
      "FailedQ":"0"
   }
]

Here is my CSV file这是我的 CSV 文件

[csvfile][2] [csv文件][2]

    RID,UId,Ugroup,Query.Statement,Query.ECategory,SuccesfulQ,FailedQ
   test,user1@gmail.com,abc,query1,error1,            7,        0
   test,user1@gmail.com,abc,query2,error2             7,        0
   test2,user2@gmail.com,xyz,query3,error3            7,        0
   test2,user2@gmail.com,xyz,query4,error4            7,        0

using below code i'm getting normal json not a nested one:使用下面的代码,我得到的是普通的 json 而不是嵌套的:

import csv
import json
def make_json(csvFilePath):
    data = {}
    with open(csvFilePath, encoding='utf-8') as csvf:
        a = [{k:v for k,v in row.items()} for row in csv.DictReader(csvf, skipinitialspace=True)]
        print(a)
csvFilePath = r'table.csv'
make_json(csvFilePath)

In this case, after you create list of dictionaries, you can just iterate over the odd rows and append the data from the even rows.在这种情况下,在创建字典列表后,您可以迭代奇数行并附加偶数行中的数据。 After that, you can use json.dumps to convert the full list to json.之后,您可以使用json.dumps将完整列表转换为 json。

Try this code.试试这个代码。 It assumes 2 rows per user query:它假设每个用户查询有 2 行:

cs = '''
RID,UId,Ugroup,Statement,ECategory,SuccesfulQ,FailedQ
test1,user1@gmail.com,abc,query1,error1,7,0
test1,user1@gmail.com,abc,query2,error2,7,0
test2,user2@gmail.com,xyz,query3,error3,7,0
test2,user2@gmail.com,xyz,query4,error4,7,0
'''.strip()

with open('table.csv','w') as f: f.write(cs)  # write test file

############# Main Script ##############

import csv
import json

def make_json(csvFilePath):
    data = {}
    lst = []    
    with open(csvFilePath, encoding='utf-8') as csvf:
        a = [{k:v for k,v in row.items()} for row in csv.DictReader(csvf, skipinitialspace=True)]
        for i in range(0,len(a),2):  # odd rows
           a[i]['Query'] = [  # combined data, new column
           {'Statement':a[i]['Statement'],'ECategory':a[i]['ECategory']},
           {'Statement':a[i+1]['Statement'],'ECategory':a[i+1]['ECategory']}
           ]           
           del a[i]['Statement'] # remove old columns
           del a[i]['ECategory']
           lst.append(a[i])  # final list  # odd rows only
        return json.dumps(lst)
        
csvFilePath = r'table.csv'
jsnFilePath = r'table.json'
jsn = make_json(csvFilePath)

with open (jsnFilePath,'w') as f:
   f.write(jsn)

Output输出

[
    {
        "RID": "test1",
        "UId": "user1@gmail.com",
        "Ugroup": "abc",
        "SuccesfulQ": "7",
        "FailedQ": "0",
        "Query": [
            {
                "Statement": "query1",
                "ECategory": "error1"
            },
            {
                "Statement": "query2",
                "ECategory": "error2"
            }
        ]
    },
    {
        "RID": "test2",
        "UId": "user2@gmail.com",
        "Ugroup": "xyz",
        "SuccesfulQ": "7",
        "FailedQ": "0",
        "Query": [
            {
                "Statement": "query3",
                "ECategory": "error3"
            },
            {
                "Statement": "query4",
                "ECategory": "error4"
            }
        ]
    }
]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM