获取Python代码以在IndexError之后保留

时间:2018-08-06 02:17:12

标签: python gzip urllib python-multithreading pyodbc

我正在从网站查询API。该API有时会因维护而关闭,并且有时可能没有可用于查询的数据。我编写了代码,即使在发生错误后也可以继续强制程序查询API,但是它似乎无法正常工作。

以下是代码:

import threading
import json
import urllib
from urllib.parse import urlparse
import httplib2 as http #External library
import datetime
import pyodbc as db
import os
import gzip
import csv
import shutil
def task():

    #Authentication parameters
    headers = { 'AccountKey' : 'secret',
    'accept' : 'application/json'} #this is by default

    #API parameters
    uri = 'http://somewebsite.com/' #Resource URL
    path = '/something/TrafficIncidents?'

    #Build query string & specify type of API call
    target = urlparse(uri + path)
    print(target.geturl())
    method = 'GET'
    body = ''

    #Get handle to http
    h = http.Http()

    #Obtain results
    response, content = h.request(target.geturl(), method, body, headers)
    api_call_time = datetime.datetime.now()

    filename = "traffic_incidents_" + str(datetime.datetime.today().strftime('%Y-%m-%d'))
    createHeader = 1
    if os.path.exists(filename + '.csv'):
        csvFile = open(filename + '.csv', 'a')
        createHeader = 0
    else:
        #compress previous day's file
        prev_filename =  "traffic_incidents_" + (datetime.datetime.today()-datetime.timedelta(days=1)).strftime('%Y-%m-%d')
        if os.path.exists(prev_filename + '.csv'):
            with open(prev_filename + '.csv' , 'rb') as f_in, gzip.open(prev_filename + '.csv.gz', 'wb') as f_out:
                shutil.copyfileobj(f_in, f_out)
            os.remove(prev_filename + '.csv')

        #create new csv file for writing
        csvFile = open(filename + '.csv', 'w')

    #Parse JSON to print
    jsonObj = json.loads(content)
    print (json.dumps(jsonObj, sort_keys=True, indent=4))

    with open("traffic_incidents.json","w") as outfile:
        #Saving jsonObj["d"]
        json.dump(jsonObj, outfile, sort_keys=True, indent=4,ensure_ascii=False)

    for i in range(len(jsonObj["value"])):
        jsonObj["value"][i]["IncidentTime"] = jsonObj["value"][i]["Message"].split(' ',1)[0]
        jsonObj["value"][i]["Message"] = jsonObj["value"][i]["Message"].split(' ',1)[1]
        jsonObj["value"][i]["ApiCallTime"] = api_call_time

    #Save to csv file
    header = jsonObj["value"][0].keys()   

    csvwriter = csv.writer(csvFile,lineterminator='\n')
    if createHeader == 1:
        csvwriter.writerow(header)

    for i in range(len(jsonObj["value"])):
        csvwriter.writerow(jsonObj["value"][i].values())

    csvFile.close()

    t = threading.Timer(120,task)
    t.start()


while True:
    try:
        task()
    except IndexError:
        pass
    else:
        break

我收到以下错误,程序停止:

"header = jsonObj["value"][0].keys()
IndexError: list index out of range"

我希望程序即使在发生IndexError之后也能继续运行。

我该如何编辑代码来实现这一目标?

0 个答案:

没有答案