Python如何优雅捕获字典或pandas行赋值失败对应的键/列名
方案1:步骤注册+循环处理(推荐,最简洁)
把所有行内操作封装为统一格式的步骤列表,只用一套try-except循环执行所有步骤,既不用重复写异常捕获逻辑,也能精确定位出错步骤:
def check_row(row): row['errors'] = [] # 每一步定义格式:(目标列名, 处理逻辑函数, 错误提示前缀) process_steps = [ ("B", lambda r: r['B'] + r['A'] if r['C'] == 'foo' else r['B'], "B列计算失败"), ("C", lambda r: r['C'].zfill(5), "C列格式化失败") ] for col, calc_func, err_prefix in process_steps: try: # 计算和赋值都在try块内执行,覆盖计算+赋值全环节异常 row[col] = calc_func(row) except Exception as e: row['errors'].append(f"{err_prefix}: {repr(e)}") # 无错误时清空errors字段 row['errors'] = '; '.join(row['errors']) if row['errors'] else '' return row
方案优势
- 所有处理逻辑集中管理,增删修改步骤只需改动
process_steps列表即可,维护成本极低 - 自动捕获计算、赋值全流程的异常,完美解决之前封装
assign函数时只能捕获赋值异常的问题 - 可以自由控制异常处理逻辑:比如遇到某步错误后是否跳过后续步骤,只需在except块内加
break即可
方案2:封装通用装饰器(适合多流水线复用)
如果有多套类似的行处理逻辑,可以把步骤执行逻辑封装为装饰器,进一步简化代码:
def row_process_decorator(steps, stop_on_error=False): def wrapper(row): row['errors'] = [] for col, calc_func, err_prefix in steps: try: row[col] = calc_func(row) except Exception as e: row['errors'].append(f"{err_prefix}: {repr(e)}") if stop_on_error: break row['errors'] = '; '.join(row['errors']) if row['errors'] else '' return row return wrapper # 使用时直接传入步骤定义即可,无需重复写异常捕获逻辑 check_row = row_process_decorator( steps=[ ("B", lambda r: r['B'] + r['A'] if r['C'] == 'foo' else r['B'], "B列计算失败"), ("C", lambda r: r['C'].zfill(5), "C列格式化失败") ], stop_on_error=False )
扩展说明
如果某步处理逻辑比较复杂,无法用lambda简写,可以单独定义普通函数传入步骤列表即可,可读性不受影响。
内容的提问来源于stack exchange,提问作者daddydan
相关产品推荐
相关产品推荐

