简体   繁体   中英

Convert Nested Json file to CSV file in Python

I have a nested Json file that I am trying to convert to a CSV file.

The Json data looks like this:

{
  "businessUnitId": 999999,
  "lastPollTime": "2021-04-12T18:30:48.703Z",
  "totalRecords": 2,
  "dispositions": [
    {
      "dispositionId": 1000,
      "dispositionName": "Reservation_Test",
      "isActive": true,
      "skills": [
        {
          "skillId": 1,
          "mediaTypeId": 3,
          "mediaTypeName": "Chat"
        },
        {
          "skillId": 2,
          "mediaTypeId": 3,
          "mediaTypeName": "Chat"
        },
        {
          "skillId": 3,
          "mediaTypeId": 3,
          "mediaTypeName": "Chat"
        }
      ]
    },
    {
      "dispositionId": 1001,
      "dispositionName": "Cancel Reservation",
      "isActive": true,
      "skills": [
        {
          "skillId": 4,
          "mediaTypeId": 3,
          "mediaTypeName": "Chat"
        },
        {
          "skillId": 5,
          "mediaTypeId": 3,
          "mediaTypeName": "Chat"
        },
        {
          "skillId": 6,
          "mediaTypeId": 3,
          "mediaTypeName": "Chat"
        },
        {
          "skillId": 7,
          "mediaTypeId": 3,
          "mediaTypeName": "Chat"
        },
        {
          "skillId": 8,
          "mediaTypeId": 4,
          "mediaTypeName": "Phone Call"
        },
        {
          "skillId": 9,
          "mediaTypeId": 4,
          "mediaTypeName": "Phone Call"
        },
        {
          "skillId": 10,
          "mediaTypeId": 4,
          "mediaTypeName": "Phone Call"
        },
        {
          "skillId": 11,
          "mediaTypeId": 4,
          "mediaTypeName": "Phone Call"
        }
   
    }
  ]
}

Here is my Code:

import json 
import csv 
  
  
# Opening JSON file and loading the data 
# into the variable data 
with open('File.json') as json_file: 
    data = json.load(json_file) 
  
dispositions = data['dispositions'] 
  
# now we will open a file for writing 
data_file = open('File.csv', 'w') 
  
# create the csv writer object 
csv_writer = csv.writer(data_file) 
  
# Counter variable used for writing  
# headers to the CSV file 
count = 0
  
for emp in dispositions: 
    if count == 0: 
  
        # Writing headers of CSV file 
        header = emp.keys() 
        csv_writer.writerow(header) 
        count += 1
  
    # Writing data of CSV file 
    csv_writer.writerow(emp.values()) 
  
data_file.close() 

When I run the code this is what I get:

dispositionName isActive skills Reservation_Test TRUE [{'skillId': 1, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 2, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 3, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}] Cancel Reservation TRUE [{'skillId':4, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 5, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 6, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 7, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 8, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}, {'skillId': 10647567, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}, {'skillId': 10647574, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}, {'skillId': 10647599, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}]

This is what I want:

dispositionId   dispositionName isActive    SkillId mediaTypeId mediaTypeName
1000    Reservation_Test    TRUE    1   3   Chat
1000    Reservation_Test    TRUE    2   3   Chat
1000    Reservation_Test    TRUE    3   3   Chat
1001    Cancel Reservation  TRUE    4   3   Chat
1001    Cancel Reservation  TRUE    5   3   Chat
1001    Cancel Reservation  TRUE    6   3   Chat
1001    Cancel Reservation  TRUE    7   3   Chat
1001    Cancel Reservation  TRUE    8   4   Phone Call
1001    Cancel Reservation  TRUE    9   4   Phone Call
1001    Cancel Reservation  TRUE    10  4   Phone Call
1001    Cancel Reservation  TRUE    11  4   Phone Call

I am just not sure how do deal with nested JSON data.

Thanks

You need to have a nested loop for the repeated content. I'd also recommend using the built-in csv.DictWriter instead of the regular csv.writer class.

data_file = open('File.csv', 'w') 

# Use the first obj to determine the header row
header = [x for x in dispositions[0].keys() if x != "skills"]
header.extend(dispositions[0]["skills"][0].keys())

csv_writer = csv.DictWriter(data_file, fieldnames=header)
csv_writer.write(header)
  
for emp in dispositions:
    # These key/values are common to each nested row
    common_fields = {
        k: v for k, v in emp.items() if k != "skills"
    }

    for skill in emp["skills"]:
        # Combine the common fields with this skill's key/values
        row = {**common_fields, **skill}
        csv_writer.write(row)
  
data_file.close() 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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