不遍历整个字典

时间:2014-12-21 18:34:10

标签: python python-2.7 dictionary

所以基本上,我有一个api,我有几个字典/数组。 (http://dev.c0l.in:5984/income_statements/_all_docs) 当从api获取每个公司的财务信息时(例如sector = technology and statement = income)python应该返回614个技术公司,但是我得到了这个错误:

Traceback (most recent call last):
  File "C:\Users\samuel\Desktop\Python Project\Mastercopy.py", line 83, in <module>
    user_input1()
  File "C:\Users\samuel\Desktop\Python Project\Mastercopy.py", line 75, in user_input1
    income_statement_fn()
  File "C:\Users\samuel\Desktop\Python Project\Mastercopy.py", line 51, in income_statement_fn
    if is_response ['sector'] == user_input3:
KeyError: 'sector'

在一家随机公司(通常在550-600家公司之一)

以下是损益表的功能

def income_statement_fn():
    user_input3 = raw_input("Which sector would you like to iterate through in Income Statement?: ")
    print 'Starting...'
    for item in income_response['rows']:
        is_url = "http://dev.c0l.in:5984/income_statements/" + item['id']
        is_request = urllib2.urlopen(is_url).read()
        is_response = json.loads(is_request)
        if is_response ['sector'] == user_input3:
            csv.writerow([
             is_response['company']['name'],
             is_response['company']['sales'],
             is_response['company']['opening_stock'],
             is_response['company']['purchases'],
             is_response['company']['closing_stock'],
             is_response['company']['expenses'],
             is_response['company']['interest_payable'],
             is_response['company']['interest_receivable']])
            print 'loading...'
    print 'done!'
    print end - start

知道可能导致此错误的原因是什么? (我不相信这是api本身)

干杯

3 个答案:

答案 0 :(得分:1)

好吧,在测试你通过urlopen来电时使用随机数传来的网址时,我得到了这个:

{"error":"not_found","reason":"missing"}

在这种情况下,您的函数将准确返回您获得的错误。如果你希望你的程序很好地处理错误并添加一个&#34;缺少&#34;例如,行代替实际数据,你可以这样做:

def income_statement_fn():
    user_input3 = raw_input("Which sector would you like to iterate through in Income Statement?: ")
    print 'Starting...'
    for item in income_response['rows']:
        is_url = "http://dev.c0l.in:5984/income_statements/" + item['id']
        is_request = urllib2.urlopen(is_url).read()
        is_response = json.loads(is_request)
        if is_response.get('sector', False) == user_input3:
            csv.writerow([
             is_response['company']['name'],
             is_response['company']['sales'],
             is_response['company']['opening_stock'],
             is_response['company']['purchases'],
             is_response['company']['closing_stock'],
             is_response['company']['expenses'],
             is_response['company']['interest_payable'],
             is_response['company']['interest_receivable']])
            print 'loading...'
        else:
            csv.writerow(['missing data'])
    print 'done!'
    print end - start

答案 1 :(得分:0)

KeyError表示您尝试使用的密钥在字典中不存在。检查密钥时,使用.get()会更安全。所以你要替换这一行:

if is_response['sector'] == user_input3:

有了这个:

if is_response.get('sector') == user_input3:

答案 2 :(得分:0)

问题似乎与income_response数据的最后一行

有关
{"id":"_design/auth","key":"_design/auth","value":{"rev":"1-3d8f282ec7c26779194caf1d62114dc7"}}

这没有sector值。您需要更改代码以处理此行,例如忽略sector键不存在的任何行。

您可以使用一些打印语句轻松调试它 - 例如插入

print item['id'], is_response.get('sector', None)

在输出CSV的部分之前的代码中。