Парсинг json файла python. Обход пропусков
Есть 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'
Может я вообще делаю это неправильно, подскажите пожалуйста.