【问题标题】:convert csv file to nested nested list of dictionaries using python使用python将csv文件转换为嵌套的嵌套字典列表
【发布时间】:2020-09-10 15:13:47
【问题描述】:

我正在尝试将 csv 文件转换为嵌套的 json:我正在寻找类似这样的 json 输出。

这是我的 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"
   }
]

这是我的 CSV 文件

[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

使用下面的代码,我得到的是普通的 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)

【问题讨论】:

  • 请将代码和数据包含为 txt 而非图像,请参阅指南
  • 是否总是有一行额外的数据(每个用户 2 行)还是可以有多行?
  • 感谢您的回复@Mike67。 SQLQuery.Status 和 SQLQuery.ECategory 是嵌套列。只有这两列会有一个额外的值。更多信息请点击 json 文件查看上面的 json 架构链接。

标签: python json csv


【解决方案1】:

在这种情况下,在创建字典列表后,您可以遍历奇数行并附加偶数行中的数据。之后,您可以使用json.dumps 将完整列表转换为json。

试试这个代码。它假设每个用户查询有 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)

输出

[
    {
        "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"
            }
        ]
    }
]

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 2014-09-16
    • 2022-12-05
    • 2023-03-11
    • 2020-05-16
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多