Парсинг json файла python. Обход пропусков

Рейтинг: 0Ответов: 0Опубликовано: 04.05.2023

Есть json файл который нужно перенести в excel. В json много записей. Я хочу вытащить email из этих записей. Вот кусок из записи где фигурирует email.

  "objects": [
    {
      "address": {
        "fullAddress": "aaaa"
      },
      "guid": "51b44792-6316-1c01-645f-1c26aef2b38a",
      "name": "aaaa",
      "region": {
        "name": "aaaaa",
        "code": "04"
      },
      "xsdData": {
        "shortName": "aaaa",
        "Email": "11111@mail.ru",
        "numberFederalList": "113",
        "Phone": "111",
        "Fax": "",
        "beachLength": "Территория 15 гектар с общим водоёмом 2,5 Га",
        "ClassificationInformation": {
          "categoryBeach": "зеленый флаг (2 категория)",
          "InfoAccredOrganization": {
            "accredOrganization": "aaaaa",
            "accredOrganizationNumber": "111",
            "accredOrganizationShortName": "dddd",
            "specialist1": "qe",
            "specialist2": "tt"
          },
          "order": {
            "dateEnd": "2026-02-17T00:00:00.000+0000",
            "licenseDateIssued": "2023-02-18T00:00:00.000+0000",
            "licenseNumber": "54/АА-118/00006-2023"
          }
        }
      }
    }
  ]

Написал код, который вытаскивает нужные мне поля и записывает их в excel.

import os
import json
import pandas as pd
from datetime import datetime
import win32com.client as win32
from pandas.tests.scalar import timestamp

with open('test2.json', 'r', encoding="utf8") as f:
    json_data = json.load(f)
rows = []

for record in json_data:
    name = record['registryType']['name']
    if name != "Реестр классифицированных объектов: пляжей":
        print("error")
        break
    else:
        number = record['xsdData']['projectOrder']['number']
        date_prisvoeniy = record['xsdData']['projectOrder']['date']
        for info in record['subjects']:
            ogrn = info['data']['organization']['ogrn']
            inn = info['data']['organization']['inn']
        for add in record['objects']:
            full_name = add['name']
            address = add['address']['fullAddress']
            region = add['region']['name']
            short_name = add['xsdData']['shortName']
            email = add['xsdData']['Email']
            numberFederalList = add['xsdData']['numberFederalList']
            Phone = add['xsdData']['Phone']
            Fax = add['xsdData']['Fax']
            beachLength = add['xsdData']['beachLength']
            categoryBeach = add['xsdData']['ClassificationInformation']['categoryBeach']
            accredOrganization = add['xsdData']['ClassificationInformation']['InfoAccredOrganization']['accredOrganization']
            accredOrganizationNumber = add['xsdData']['ClassificationInformation']['InfoAccredOrganization']['accredOrganizationNumber']
            accredOrganizationShortName = add['xsdData']['ClassificationInformation']['InfoAccredOrganization']['accredOrganizationShortName']
            specialist1 = add['xsdData']['ClassificationInformation']['InfoAccredOrganization']['specialist1']
            specialist2 = add['xsdData']['ClassificationInformation']['InfoAccredOrganization']['specialist2']
            licenseNumber = add['xsdData']['ClassificationInformation']['order']['licenseNumber']
            data_vidachy = add['xsdData']['ClassificationInformation']['order']['licenseDateIssued']
            srok_deistviy = add['xsdData']['ClassificationInformation']['order']['dateEnd']
    rows.append([numberFederalList, short_name, full_name, region, inn, ogrn, address, Phone, Fax, email, beachLength, accredOrganizationNumber, accredOrganizationShortName, accredOrganization, categoryBeach, number, date_prisvoeniy, licenseNumber, data_vidachy, srok_deistviy, specialist1, specialist2])

ExcelApp = win32.Dispatch('Excel.Application')
ExcelApp.Visible = True

wb = ExcelApp.Workbooks.Add()
ws = wb.Worksheets(1)

header_labels = ('Порядковый номер в Федеральном перечне', 'Наименование', 'Полное наименование', 'Регион', 'ИНН', 'ОГРН', 'Адрес', 'Телефон', 'Факс', 'Email', 'Протяженность пляжа', 'Номер Аккредитованой организации', 'Аккредитованная организация - короткое наименование', 'Аккредитованная организация', 'Категория пляжа', 'Номер решения о присвоении категории', 'Дата решения о присвоении категории', 'Регистрационный номер свидетельства', 'Дата выдачи свидетельства', 'Срок действия', 'Специалист по классификации 1', 'Специалист по классификации 2')

for indx, val in enumerate(header_labels):
    ws.Cells(1, indx + 1).Value = val

row_tracker = 2
column_size = len(header_labels)

for row in rows:
    ws.Range(
        ws.Cells(row_tracker, 1),
        ws.Cells(row_tracker, column_size)
    ).value = row
    row_tracker += 1

wb.SaveAs(os.path.join(os.getcwd(), '1111.xlsx'), 51)
wb.Close()
ExcelApp.Quit()
ExcelApp = None

Вот непосредственно путь до email.

email = add['xsdData']['Email']

На данный момент код полностью рабочий, поскольку сейчас для примера взял 1 запись из json. Но есть такие записи где просто отсутствует email (то есть в записи есть xsdData, но там нет раздела email). Либо полностью отсутствует раздел xsdData (ну и соответственно email в записи отсутствует полностью).

Хотел бы понять как мне сделать так, чтобы если в записи нет каких-то полей, их просто записывали пропусками в excel (если у записи нет раздела xsdData, то в excel в колонку email просто записали пустоту), поскольку такая ситуация не только с email, но и с другими полями. На данный момент, если в записи нет какого-то поля, выдает ошибку.

Traceback (most recent call last):
  File "C:\Users\ROG\Desktop\Восход\Задачи\Задача 3\script\main.py", line 28, in <module>
    email = add['xsdData']['Email']
KeyError: 'Email'

Может я вообще делаю это неправильно, подскажите пожалуйста.

Ответы

Ответов пока нет.