48

我对 Python 还是很陌生,使用 Pandas,在调试 Python 脚本时遇到了一些问题。

我收到以下警告消息:

[...]\pandas\core\index.py:756: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
return self._engine.get_loc(key)

并且找不到它的来源。

经过一番研究,我尝试在 Pandas lib 文件 (index.py) 中执行此操作:

try:
    return self._engine.get_loc(key)
except UnicodeWarning:
    warnings.warn('Oh Non', stacklevel=2)

但这并没有改变警告消息的任何内容。

4

4 回答 4

53

您可以过滤要引发的警告,这将使您能够进行调试(例如,使用 pdb):

import warnings
warnings.filterwarnings('error')

*警告过滤器可以更精细地管理(这可能更合适)例如:

warnings.filterwarnings('error', category=UnicodeWarning)
warnings.filterwarnings('error', message='*equal comparison failed*')

将按顺序查找多个过滤器。(“靠近列表前面的条目会覆盖列表后面的条目,如果两者都匹配特定警告。”)

于 2013-06-20T10:48:35.743 回答
14

您还可以使用命令行来控制警告:

python -W error::UnicodeWarning your_code.py

从手册页:

-W 参数
[...]错误以引发异常而不是打印警告消息。

这与在代码中添加以下内容具有相同的效果:

import warnings
warnings.filterwarnings('error', category=UnicodeWarning)

正如安迪的回答中已经说过的那样。

于 2016-10-26T10:58:38.857 回答
1

如果您在 python 中启用日志记录,那么当收到异常时,您可以使用该方法logging.exception在捕获到异常时进行记录 - 此方法将打印出格式良好的堆栈跟踪,准确地显示异常起源的代码中。有关更多信息,请参阅有关日志记录的 python 文档

import logging
log = logging.getLogger('my.module.logger')

try:
    return self._engine.get_loc(key)
except UnicodeWarning:
    log.exception('A log message of your choosing')

或者,您可以通过调用获取包含代码中异常详细信息的元组sys.exc_info()(这需要您导入sys模块)。

于 2013-06-20T08:22:52.520 回答
1

调查警告信息最丰富的方法是将其转换为错误 ( Exception),以便您可以查看其完整的堆栈跟踪:

import warnings
warnings.simplefilter("error")

警告

于 2020-09-25T21:40:58.667 回答