Python 如何打印异常中有问题的行

Python 如何打印异常中有问题的行,python,pandas,Python,Pandas,我在代码中使用熊猫,同时使用下面的代码处理一些数据帧: def exit(exitCode, errorMsg=None, monitor_thread=None): if exitCode is not None: logger.error(errorMsg) logger.error(traceback.format_exc()) sys.exit(exitCode) try: results['name'] = results['name'

我在代码中使用熊猫,同时使用下面的代码处理一些数据帧:

def exit(exitCode, errorMsg=None, monitor_thread=None):
   if exitCode is not None:
       logger.error(errorMsg)
       logger.error(traceback.format_exc())
   sys.exit(exitCode)

try:
    results['name'] = results['name'].astype(float).astype(int)
except Exception as e:  # catch *all* exceptions
    exit("Failed to convert name" + str(e), 8)
我得到这个错误:

回溯(最近一次呼叫最后一次):

文件“DIST\FDmanInfo.py”,第206行,在

文件“DIST\FDmanInfo.py”,主目录第191行

文件“\local\Python\lib\site packages\pandas\core\generic.py”,第行 3054,A型 上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升

文件“\local\Python\lib\site packages\pandas\core\internals.py”, 第3189行,在astype中

返回self.apply('astype',dtype=dtype,**kwargs)

文件“\local\Python\lib\site packages\pandas\core\internals.py”, 第3056行中的“应用” 应用=getattr(b,f)(**kwargs)

文件“\local\Python\lib\site packages\pandas\core\internals.py”, 第461行,在astype中 值=值,**kwargs)

文件“\local\Python\lib\site packages\pandas\core\internals.py”, 第504行,输入类型 values=\u astype\u nansafe(values.ravel(),dtype,copy=True)

文件“\local\Python\lib\site packages\pandas\types\cast.py”,第行 531,在南萨菲 raise VALUERROR('无法将NA转换为整数')VALUERROR:无法将NA转换为整数

我想知道是哪一行出了问题,但我找不到在异常情况下如何将其(该行)打印到日志中,就像输入数据帧是:

0.1.0

1楠

2.3.0

3.4.0

我希望它在失败的行上打印,在本例中为“1 NaN”, 有可能吗


谢谢,

您可以使用内置python库

更新 检查回溯工作原理的简单示例:

建议如何调整当前代码

但是,使用Pandas,您可以简单地列出未转换的值。诀窍是使用具有附加选项的
pd.to_numeric
,而不是使用
pd.Series.astype

例如:

s = pd.to_numeric(results['name'], errors='coerce').astype(int)
failed = results['name'].loc[s.isnull()]

嗨,首先,谢谢你的帮助!我编辑了我的Q,请检查一下。我之前已经在exit func中使用了format_exc(),如果我像您那样使用它,我应该期望结果吗?谢谢当您按照您的格式使用traceback.format_exc()时,您可以看到错误没有传播。我已经更新了答案。检查差异您是绝对最新的,在我的代码中,退出定义出现在try-catch之前,这就是为什么它对我有效。。
import traceback
try:
    results['name'] = results['name'].astype(float).astype(int)
except Exception as e:  # catch *all* exceptions
    tb = traceback.format_exc()
    print(tb)
    exit("Failed to convert name" + str(e), 8)

def exit(exitCode, errorMsg=None, monitor_thread=None):
   if exitCode is not None:
       logger.error(errorMsg)
       logger.error(traceback.format_exc())
   sys.exit(exitCode)
import traceback

try:
    a = [] + None
except Exception as e:
    tb = traceback.format_exc()
    print(tb)
    exit("Failed to convert name" + str(e))


def exit(exitCode):
    print(exitCode)
    print(traceback.format_exc())
s = pd.to_numeric(results['name'], errors='coerce').astype(int)
failed = results['name'].loc[s.isnull()]