所以基本上,我有一个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本身)
干杯
答案 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的部分之前的代码中。