【问题标题】:JSON to CSV with Python Error with keys that don't exsitJSON to CSV with Python Error with keys that doesn't exist
【发布时间】:2021-08-05 08:10:28
【问题描述】:

我想将 JSON 数据转换为 csv 文件,问题是并非所有数据都相同,它们的键也不相同。我设法手动打印了第一行键名,然后我调用了相应键的每个值。

我的代码:

import json
import csv

with open("./res.json") as file:
    data = json.load(file)

file_name = "output.csv"

with open(file_name, "w") as file:
    csv_file = csv.writer(file)
    csv_file.writerow(["Account_Name__c", "License_Address__c", "Operating_Name__c", "Property_Location__c", "License_Address_for_Business_Directroy__c", "License_Status__c", "Account__c", "Building__c", "Longitude__c", "Latitude__c", "Id", "CurrencyIsoCode", "Property_Location__r"])
    if "resultData" in data:
        for item in data["resultData"]:
            csv_file.writerow([item['Account_Name__c'], item['License_Address__c'], item['Operating_Name__c'], item['Property_Location__c'], item['License_Address_for_Business_Directroy__c'], item['License_Status__c'], item['Account__c'], item['Building__c'], item['Longitude__c'], item['Latitude__c'], item['Id'], item['CurrencyIsoCode'], item['Property_Location__r']])

数据样本

{
  "resultData": [
    {
      "Account_Name__c": "ZURI FLOWERS DMCC",
      "License_Address__c": "Unit No: 2201<br>Tiffany Towers<br>Plot No: JLT-PH2-W2A<br>Jumeirah Lakes Towers<br>Dubai<br>UAE",
      "Operating_Name__c": "001b000000MV4EnAAL",
      "Property_Location__c": "a1G10000000XLRNEA4",
      "License_Address_for_Business_Directroy__c": "Unit No: 2201<br>Tiffany Towers<br>Jumeirah Lakes Towers<br>Dubai<br>UAE",
      "License_Status__c": "Active",
      "Account__c": "001b000000MV4EnAAL",
      "Building__c": "Tiffany Towers",
      "Longitude__c": "55.14960835",
      "Latitude__c": "25.07726334",
      "Id": "a03b0000006h0Y7AAI",
      "CurrencyIsoCode": "AED",
      "Operating_Name__r": {
        "Name": "ZURI FLOWERS DMCC",
        "Id": "001b000000MV4EnAAL",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      },
      "Property_Location__r": {
        "Name": "PL-017352",
        "Function_Type_Class__c": "Office",
        "Id": "a1G10000000XLRNEA4",
        "RecordTypeId": "01210000000YFA3AAO",
        "CurrencyIsoCode": "AED"
      },
      "Account__r": {
        "Publishing_agreement_for_BD__c": "Publish all details in DMCC online/printed content",
        "Name": "ZURI FLOWERS DMCC",
        "Phone_BD__c": "+971506570630",
        "Company_Website_Address__c": "01:00",
        "Company_Official_Email_Address__c": "kakaji1@gmail.com",
        "Saturday_From__c": "Closed",
        "Saturday_To__c": "Closed",
        "Operating_Time_from_regular__c": "09:00 AM",
        "Operating_Time_to_regular__c": "05:00 PM",
        "Monday_From__c": "09:00 AM",
        "Monday_To__c": "05:00 PM",
        "Tuesday_From__c": "09:00 AM",
        "Tuesday_To__c": "05:00 PM",
        "Wednesday_From__c": "09:00 AM",
        "Wednesday_To__c": "05:00 PM",
        "Thursday_From__c": "09:00 AM",
        "Thursday_To__c": "04:00 PM",
        "Friday_From__c": "Closed",
        "Friday_To__c": "Closed",
        "Id": "001b000000MV4EnAAL",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      }
    },
    {
      "Account_Name__c": "ZYDUS WORLDWIDE DMCC",
      "License_Address__c": "Unit No: 908<br>Armada 2<br>Plot No: JLT-PH2-P2A<br>Jumeirah Lakes Towers<br>Dubai<br>UAE",
      "Operating_Name__c": "0011000000jkjT1AAI",
      "Property_Location__c": "a1G10000000XKCCEA4",
      "License_Address_for_Business_Directroy__c": "Unit No: 908<br>Armada 2<br>Jumeirah Lakes Towers<br>Dubai<br>UAE",
      "License_Status__c": "Active",
      "Account__c": "0011000000jkjT1AAI",
      "Building__c": "Armada 2",
      "Longitude__c": "55.14552528",
      "Latitude__c": "25.07481256",
      "Id": "a031000000M6HQ6AAN",
      "CurrencyIsoCode": "AED",
      "Operating_Name__r": {
        "Name": "ZYDUS WORLDWIDE DMCC",
        "Id": "0011000000jkjT1AAI",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      },
      "Property_Location__r": {
        "Name": "PL-012567",
        "Function_Type_Class__c": "Office",
        "Id": "a1G10000000XKCCEA4",
        "RecordTypeId": "01210000000YFA3AAO",
        "CurrencyIsoCode": "AED"
      },
      "Account__r": {
        "Publishing_agreement_for_BD__c": "Publish only name and address in DMCC online/printed content",
        "Name": "ZYDUS WORLDWIDE DMCC",
        "Phone_BD__c": "+97143998182",
        "Website": "www.zyduscadila.com",
        "Company_Official_Email_Address__c": "ketanbhut@zydusworldwide.ae",
        "Saturday_From__c": "Closed",
        "Saturday_To__c": "Closed",
        "Operating_Time_from_regular__c": "09:00 AM",
        "Operating_Time_to_regular__c": "06:00 PM",
        "Monday_From__c": "09:00 AM",
        "Monday_To__c": "06:00 PM",
        "Tuesday_From__c": "09:00 AM",
        "Tuesday_To__c": "06:00 PM",
        "Wednesday_From__c": "09:00 AM",
        "Wednesday_To__c": "06:00 PM",
        "Thursday_From__c": "09:00 AM",
        "Thursday_To__c": "06:00 PM",
        "Friday_From__c": "Closed",
        "Friday_To__c": "Closed",
        "Id": "0011000000jkjT1AAI",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      }
    },
    {
      "Account_Name__c": "ZYLIN TECHNOLOGIES DMCC",
      "License_Address__c": "Unit No: 3O-01-2357<br>Jewellery &amp; Gemplex 3<br>Plot No: DMCC-PH2-J&amp;GPlexS<br>Jewellery &amp; Gemplex<br>Dubai<br>United Arab Emirates",
      "Property_Location__c": "a1G10000001X1gHEAS",
      "License_Status__c": "Active",
      "Account__c": "0015F00001NOV3iQAH",
      "Building__c": "55.13646334",
      "Id": "a035F00001K4be6QAB",
      "CurrencyIsoCode": "AED",
      "Property_Location__r": {
        "Name": "PL-128190",
        "Function_Type_Class__c": "Flexi Desk",
        "Id": "a1G10000001X1gHEAS",
        "RecordTypeId": "01210000000YFA5AAO",
        "CurrencyIsoCode": "AED"
      },
      "Account__r": {
        "Publishing_agreement_for_BD__c": "Publish all details in DMCC online/printed content",
        "Name": "ZYLIN TECHNOLOGIES DMCC",
        "Phone_BD__c": "+971504569106",
        "Company_Official_Email_Address__c": "ziad@zylintech.com",
        "Saturday_From__c": "Closed",
        "Saturday_To__c": "Closed",
        "Operating_Time_from_regular__c": "09:00 AM",
        "Operating_Time_to_regular__c": "05:00 PM",
        "Monday_From__c": "09:00 AM",
        "Monday_To__c": "05:00 PM",
        "Tuesday_From__c": "09:00 AM",
        "Tuesday_To__c": "05:00 PM",
        "Wednesday_From__c": "09:00 AM",
        "Wednesday_To__c": "05:00 PM",
        "Thursday_From__c": "09:00 AM",
        "Thursday_To__c": "05:00 PM",
        "Friday_From__c": "Closed",
        "Friday_To__c": "Closed",
        "Id": "0015F00001NOV3iQAH",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      }
    },
    {
      "Account_Name__c": "ZYLWAY DMCC",
      "License_Address__c": "Unit No: 3O-01-3360<br>Jewellery &amp; Gemplex 3<br>Plot No: DMCC-PH2-J&amp;GPlexS<br>Jewellery &amp; Gemplex<br>Dubai<br>United Arab Emirates",
      "Property_Location__c": "a1G5F000002KAF5UAO",
      "License_Status__c": "Active",
      "Account__c": "0015F00001TmYjTQAV",
      "Building__c": "55.13646334",
      "Id": "a035F00001TS4hiQAD",
      "CurrencyIsoCode": "AED",
      "Property_Location__r": {
        "Name": "PL-357158",
        "Function_Type_Class__c": "Flexi Desk",
        "Id": "a1G5F000002KAF5UAO",
        "RecordTypeId": "01210000000YFA5AAO",
        "CurrencyIsoCode": "AED"
      },
      "Account__r": {
        "Name": "ZYLWAY DMCC",
        "Phone_BD__c": "+971564158834",
        "Id": "0015F00001TmYjTQAV",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      }
    },
    {
      "Account_Name__c": "ZYMENON UDSTYRE CONSULTING DMCC",
      "License_Address__c": "Unit No: 2H-05-124<br>Jewellery &amp; Gemplex 2<br>Plot No: DMCC-PH2-J&amp;GPlexS<br>Jewellery &amp; Gemplex<br>DUBAI<br>United Arab Emirates",
      "Property_Location__c": "a1G10000000XGmnEAG",
      "License_Status__c": "Active",
      "Account__c": "0011000000xig08AAA",
      "Building__c": "55.13603472",
      "Id": "a031000000YrBUGAA3",
      "CurrencyIsoCode": "AED",
      "Property_Location__r": {
        "Name": "PL-001899",
        "Function_Type_Class__c": "Flexi Desk",
        "Id": "a1G10000000XGmnEAG",
        "RecordTypeId": "01210000000YFA5AAO",
        "CurrencyIsoCode": "AED"
      },
      "Account__r": {
        "Publishing_agreement_for_BD__c": "Publish only name and address in DMCC online/printed content",
        "Name": "ZYMENON UDSTYRE CONSULTING DMCC",
        "Phone_BD__c": "+97144320400",
        "Company_Official_Email_Address__c": "tasawar.hussayn@panoramaconsulting.ae",
        "Saturday_From__c": "Closed",
        "Saturday_To__c": "Closed",
        "Operating_Time_from_regular__c": "09:00 AM",
        "Operating_Time_to_regular__c": "05:00 PM",
        "Monday_From__c": "09:00 AM",
        "Monday_To__c": "05:00 PM",
        "Tuesday_From__c": "09:00 AM",
        "Tuesday_To__c": "05:00 PM",
        "Wednesday_From__c": "09:00 AM",
        "Wednesday_To__c": "05:00 PM",
        "Thursday_From__c": "09:00 AM",
        "Thursday_To__c": "05:00 PM",
        "Friday_From__c": "Closed",
        "Friday_To__c": "Closed",
        "Id": "0011000000xig08AAA",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      }
    },
    {
      "Account_Name__c": "ZYWA PAYMENTS DMCC",
      "License_Address__c": "Unit No: 3306-1<br>Mazaya Business Avenue BB1<br>Plot No: JLTE-PH2-BB1<br>Jumeirah Lakes Towers<br>Dubai<br>UAE",
      "Property_Location__c": "a1G10000001W6LgEAK",
      "License_Address_for_Business_Directroy__c": "Unit No: 3306-1<br>Mazaya Business Avenue BB1<br>Jumeirah Lakes Towers<br>Dubai<br>UAE",
      "License_Status__c": "Active",
      "Account__c": "0015F00001VsGJFQA3",
      "Building__c": "55.1450717",
      "Longitude__c": "55.1450717",
      "Latitude__c": "25.06828081",
      "Id": "a035F00001ZVZS0QAP",
      "CurrencyIsoCode": "AED",
      "Property_Location__r": {
        "Name": "PL-102042",
        "Function_Type_Class__c": "BC Office 4",
        "Id": "a1G10000001W6LgEAK",
        "RecordTypeId": "01210000000YFA5AAO",
        "CurrencyIsoCode": "AED"
      },
      "Account__r": {
        "Name": "ZYWA PAYMENTS DMCC",
        "Phone_BD__c": "+971509708621",
        "Id": "0015F00001VsGJFQA3",
        "RecordTypeId": "01210000000a3e5AAA",
        "CurrencyIsoCode": "AED"
      }
    }
  ]
}

pycharm 会出现这个错误

Traceback(最近一次调用最后一次): 文件“../json_to_csv.py”,第 14 行,在 csv_file.writerow([item['Account_Name__c'],item['License_Address__c'],item['Operating_Name__c'],item['Property_Location__c'],item['License_Address_for_Business_Directroy__c'],item['License_Status__c'],item[' Account__c'],item['Building__c'],item['Longitude__c'],item['Latitude__c'],item['Id'],item['CurrencyIsoCode'],item['Property_Location__r']]) KeyError: 'Operating_Name__c'

【问题讨论】:

    标签: python json csv


    【解决方案1】:

    Operating_name_c 似乎没有密钥。 Operating_name__r 有一个密钥。

    【讨论】:

      【解决方案2】:

      最好的解决方案是先扫描所有记录并收集所有可能的键:

      all_keys = set()
      for item in data["resultData"]:
          all_keys |= item.keys()
      

      之后,all_keys 将包含所有可能的值,即 CSV 的所有列。

      if "resultData" in data:
          all_keys = set()
          for item in data["resultData"]:
              all_keys |= item.keys()
          for item in data["resultData"]:
                  csv_file.writerow([item.get(k) for k in all_keys ])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-26
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 2014-05-31
        • 2021-07-13
        • 2020-03-13
        • 2021-06-29
        相关资源
        最近更新 更多