簡體   English   中英

將嵌套的 Json 文件轉換為 Python 中的 CSV 文件

[英]Convert Nested Json file to CSV file in Python

我有一個嵌套的 Json 文件,我正在嘗試將其轉換為 CSV 文件。

Json 數據如下所示:

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

這是我的代碼:

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() 

當我運行代碼時,這就是我得到的:

dispositionName isActive 技能 Reservation_Test TRUE [{'skillId': 1, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 2, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 3, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}] 取消預訂 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': '電話'}, {'skillId': 10647567, 'mediaTypeId': 4, 'mediaTypeName':'電話'},{'skillId':10647574,'mediaTypeId':4,'mediaTypeName':'電話'},{'skillId':10647599,'mediaTypeId':4,'mediaTypeName': '電話'}]

這就是我要的:

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

我只是不確定如何處理嵌套的 JSON 數據。

謝謝

您需要為重復的內容創建一個嵌套循環。 我還建議使用內置的csv.DictWriter而不是常規的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() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM