我正在尝试通过以下代码处理HTTP IncompleteRead错误。但是,我发现只要我调用message
查看异常处理是否有效,我就会在行'NoneType' object has no attribute '__getitem__'
中收到错误df = update(currency)[1]
,尽管在update
时尝试处理这种情况返回NoneType
。
import csv
from io import BytesIO
import pandas as pd
import os
from zipfile import ZipFile
from pprint import pprint, pformat
import http.client
import urllib.request
import urllib.parse
def update(ABBRV):
if ABBRV == 'LAB':
try:
my_url = 'http://www.bankofcanada.ca/stats/results/csv'
data = urllib.parse.urlencode({"lookupPage": "lookup_yield_curve.php",
"startRange": "1986-01-01",
"searchRange": "all"})
binary_data = data.encode('utf-8')
req = urllib.request.Request(my_url, binary_data)
result = urllib.request.urlopen(req)
zipdata = result.read()
#In case of http.client.IncompleteRead Error
except http.client.IncompleteRead as e:
df = update(ABBRV)[1]
return df
zipfile = ZipFile(BytesIO(zipdata))
df = pd.read_csv(zipfile.open(zipfile.namelist()[0]))
df = pd.melt(df, id_vars=['Date'])
def getYear(s):
x = re.search('(\d+)',s)
return (float(x.groups()[0]))/100 if x is not None else 'empty string'
if df is None:
dict = {}
symbols = ['Date','Mat', 'VAL', 'ABBRV']
for l in symbols:
dict0[l] = 0
df = pd.Series(dict0, name='Data')
return [df, result]
if ABBRV != 'LAB':
raise ValueError
def message(ABBRV):
df = update(ABBRV)[1]
if isinstance(df, pd.DataFrame) != 1:
return 300
else:
return 200
调用该函数:
sg = message('LAB')
print sg
谢谢
编辑:这部分代码是否无法阻止返回None
类型?此外,编辑上述代码的缩进问题反映了Anand S Kumar的建议。
if df is None:
dict = {}
symbols = ['Date','Mat', 'VAL', 'ABBRV']
for l in symbols:
dict0[l] = 0
df = pd.Series(dict0, name='Data')
答案 0 :(得分:1)
我在代码中看到了一些问题 -
在try函数内部,如果没有错误发生,你没有返回任何内容,如果你没有从函数返回任何东西,那么就像函数返回None
,因此假设有url
获取方没有错误,您最终会返回None
,然后尝试拨打[1]
NoneType
,导致您的问题出现问题。
如果发生了IncompleteRead Exception,您再次调用update(currency)
是什么让您认为如果第一次读取不成功,第二次成功?对我来说,如果存在IncompleteRead异常,该函数将进入无限递归,并在某个时间后以{0}}结束时出现以下错误。
条件RuntimeError: maximum recursion depth exceeded
在条件 - if ABBRV != 'LAB': raise ValueError
内,我说的第一个条件(不等于)永远不会是真的,我想你想把这个条件放在if块之外(最好放一个if ABBRV == 'LAB':
,而不是再次检查另一个条件。)
建议不要将函数调用为 - else
,也可以将它们分成两行,首先得到df = update(ABBRV)[1]
的结果,然后检查它是否为update(ABBRV)
},如果它不是None
,则在其上调用None
并执行其余逻辑。