如何忽略按键错误并继续 while 循环
How to ignore a key error and continue the while loop
我正在尝试使用 python 的 pandas 库创建一个数据框,利用通过请求响应获得的数据。问题是当 API 上没有可用的项目时,它会引发 KeyError 并使程序崩溃。
正在对每个产品名称迭代源数据框。然后它获取该行的产品名称并查找存在多少不同的 SKU,在新数据框中为每个 SKU 创建一行并将一些数量和其他需要的信息添加到新数据框中。这个想法是在第一个数据帧上重复一行所有相同的信息,但是许多 SKU 更新了该 SKU 的数量和包裹 ID。
如果返回的响应长度为0,我仍然希望它从第一个数据帧追加行
def create_additional_rows_needed(comb_data):
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")
new_combined_data = pd.DataFrame(columns=comb_data.columns)
COVA_DATA_LEN = 2993
row = 0
current_item = ''
while row < len(comb_data):
number_of_skus = 0
current_item = comb_data.iloc[row, 1]
if (len(current_item)) is not None:
number_of_skus = len(find_gb_product(current_item))
else:
number_of_skus = 0
current_quantity = find_gb_product(current_item).iloc[number_of_skus - 1, find_gb_product(current_item).columns.get_loc('quantity')]
logger.info('Current Quantity: {}'.format(current_quantity))
current_package = find_gb_product(current_item)['lot_number'][number_of_skus - 1]
if number_of_skus == 0:
pass
while number_of_skus > 0:
logger.info('Current Item: {}'.format(current_item))
logger.info('Number of Skus: {}'.format(number_of_skus))
logger.info('Appending: {}'.format(comb_data.iloc[row, 1]))
new_combined_data = new_combined_data.append([comb_data.iloc[row, :]])
new_combined_data.iloc[-1, new_combined_data.columns.get_loc('TotalOnHand')] = current_quantity
new_combined_data.iloc[-1, new_combined_data.columns.get_loc('PackageId')] = current_package
number_of_skus = number_of_skus - 1
logger.info('Finished index {}'.format(row))
row = row + 1
logger.info('Moving to index {}'.format(row))
return new_combined_data
除了少数几个项目外,每个项目都很顺利。这是我得到的错误。
KeyError
2889 return self._engine.get_loc(casted_key)
2890 except KeyError as err:
-> 2891 raise KeyError(key) from err
2892
2893 if tolerance is not None:
KeyError: 'quantity'
这已经占用了我整个周末和我所有的睡眠,并且在周一上午 10 点 MST 到期,只有两天通知。请帮助我。
捕获错误并继续应该可以。大致如下:
while row < len(comb_data):
....
try:
current_quantity = find_gb_product(current_item).iloc[number_of_skus - 1, find_gb_product(current_item).columns.get_loc('quantity')]
except KeyError:
continue
....
我正在尝试使用 python 的 pandas 库创建一个数据框,利用通过请求响应获得的数据。问题是当 API 上没有可用的项目时,它会引发 KeyError 并使程序崩溃。
正在对每个产品名称迭代源数据框。然后它获取该行的产品名称并查找存在多少不同的 SKU,在新数据框中为每个 SKU 创建一行并将一些数量和其他需要的信息添加到新数据框中。这个想法是在第一个数据帧上重复一行所有相同的信息,但是许多 SKU 更新了该 SKU 的数量和包裹 ID。
如果返回的响应长度为0,我仍然希望它从第一个数据帧追加行
def create_additional_rows_needed(comb_data):
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")
new_combined_data = pd.DataFrame(columns=comb_data.columns)
COVA_DATA_LEN = 2993
row = 0
current_item = ''
while row < len(comb_data):
number_of_skus = 0
current_item = comb_data.iloc[row, 1]
if (len(current_item)) is not None:
number_of_skus = len(find_gb_product(current_item))
else:
number_of_skus = 0
current_quantity = find_gb_product(current_item).iloc[number_of_skus - 1, find_gb_product(current_item).columns.get_loc('quantity')]
logger.info('Current Quantity: {}'.format(current_quantity))
current_package = find_gb_product(current_item)['lot_number'][number_of_skus - 1]
if number_of_skus == 0:
pass
while number_of_skus > 0:
logger.info('Current Item: {}'.format(current_item))
logger.info('Number of Skus: {}'.format(number_of_skus))
logger.info('Appending: {}'.format(comb_data.iloc[row, 1]))
new_combined_data = new_combined_data.append([comb_data.iloc[row, :]])
new_combined_data.iloc[-1, new_combined_data.columns.get_loc('TotalOnHand')] = current_quantity
new_combined_data.iloc[-1, new_combined_data.columns.get_loc('PackageId')] = current_package
number_of_skus = number_of_skus - 1
logger.info('Finished index {}'.format(row))
row = row + 1
logger.info('Moving to index {}'.format(row))
return new_combined_data
除了少数几个项目外,每个项目都很顺利。这是我得到的错误。
KeyError
2889 return self._engine.get_loc(casted_key)
2890 except KeyError as err:
-> 2891 raise KeyError(key) from err
2892
2893 if tolerance is not None:
KeyError: 'quantity'
这已经占用了我整个周末和我所有的睡眠,并且在周一上午 10 点 MST 到期,只有两天通知。请帮助我。
捕获错误并继续应该可以。大致如下:
while row < len(comb_data):
....
try:
current_quantity = find_gb_product(current_item).iloc[number_of_skus - 1, find_gb_product(current_item).columns.get_loc('quantity')]
except KeyError:
continue
....