Как заблокировать Keyerror в Python от повторения или создать исключение для его обработки? - PullRequest
4 голосов
/ 19 февраля 2020

Я новичок в Python и работаю с API,

Мой код ниже:

import pandas as pd
import json
from pandas.io.json import json_normalize
import datetime

threedaysago = datetime.date.fromordinal(datetime.date.today().toordinal()-3).strftime("%F")
import http.client

conn = http.client.HTTPSConnection("api.sendgrid.com")
payload = "{}"

keys = {
#    "CF" : "SG.UdhzjmjYR**.-",
}
df = []  # Create new Dataframe

for name, value in keys.items():
    headers = { 'authorization': "Bearer " + value }

    conn.request("GET", "/v3/categories/stats/sums?aggregated_by=&start_date={d}&end_date={d}".format(d=threedaysago), payload, headers)

    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))

    d = json.loads(data.decode("utf-8"))
    c=d['stats']
#    row = d['stats'][0]['name']
    # Add Brand to data row here with 'name'
    df.append(c)  # Load data row into df
#1    
df = pd.DataFrame(df[0])
df_new = df[['name']]
df_new.rename(columns={'name':'Category'}, inplace=True)
df_metric =pd.DataFrame(list(df['metrics'].values))
sendgrid = pd.concat([df_new, df_metric], axis=1, sort=False)
sendgrid.set_index('Category', inplace = True)
sendgrid.insert(0, 'Date', threedaysago)
sendgrid.insert(1,'BrandId',99)
sendgrid.rename(columns={
                       'blocks':'Blocks',
                       'bounce_drops' : 'BounceDrops',
                       'bounces': 'Bounces',
                       'clicks':'Clicks',
                       'deferred':'Deferred',
                       'delivered':'Delivered',
                       'invalid_emails': 'InvalidEmails',
                       'opens':'Opens',
                       'processed':'Processed',
                       'requests':'Requests',
                       'spam_report_drops' : 'SpamReportDrops',
                       'spam_reports' : 'SpamReports',
                       'unique_clicks' : 'UniqueClicks',
                       'unique_opens' : 'UniqueOpens',
                       'unsubscribe_drops' : 'UnsubscribeDrops',
                       'unsubscribes': 'Unsubscribes'
                       }, 
                 inplace=True)

Однако, когда я запускаю это, я получаю сообщение об ошибке:

KeyError: "None of [Index(['name'], dtype='object')] are in the [columns]"

Я знаю причину, по которой это происходит, потому что нет статистики за три дня a go:

{"date":"2020-02-16","stats":[]}

Но как мне обработать эти исключения в моем коде, потому что это будет работать как ежедневный отчет, и он сломается, если эта ошибка не будет обработана.

...