python - 使用换行符过滤第三方 Python 警告
问题描述
我正在尝试使用环境变量抑制来自第三方模块(在本例中为 PyTables via Pandas)的警告。警告以换行符开头。
警告示例:
python -c 'import pandas as pd; pd.DataFrame([None]).to_hdf("test.h5", "/data")'
/usr/lib/python3.9/site-packages/pandas/core/generic.py:2606: PerformanceWarning:
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed,key->block0_values] [items->Int64Index([0], dtype='int64')]
pytables.to_hdf(
根据 Python 文档,我可以通过设置PYTHONWARNINGS
格式来指定要忽略的警告action:message:category:module:line
使用category
我试过PYTHONWARNINGS=ignore::PerformanceWarning
了,但这给了我信息Invalid -W option ignored: unknown warning category: 'PerformanceWarning'
。
PYTHONWARNINGS=ignore::pytables.PerformanceWarning
给我Invalid -W option ignored: invalid module name: 'pytables'
。
使用message
我最初尝试过PYTHONWARNINGS=ignore:your performance may suffer
什么都不做,可能是由于警告消息以换行符开头。
进一步探索换行案例,我尝试插入换行符,但是它要么被转义要么被删除:
PYTHONWARNINGS="ignore:\nyour performance" python -c "import warnings as w; [print(f) for f in w.filters]"
('ignore', re.compile('\\\\nyour\\ performance', re.IGNORECASE), <class 'Warning'>, None, 0)
// ...
PYTHONWARNINGS="$(echo -n "ignore:\nyour performance")" python -c "import warnings as w; [print(f) for f in w.filters]"
('ignore', re.compile('your\\ performance', re.IGNORECASE), <class 'Warning'>, None, 0)
// ...
PYTHONWARNINGS="ignore:.your performance" python -c "import warnings as w; [print(f) for f in w.filters]"
('ignore', re.compile('\\.your\\ performance', re.IGNORECASE), <class 'Warning'>, None, 0)
// ...
如何禁用此警告?
(我知道我可以使用类似的东西来做到这一点python -c 'import pandas as pd; import warnings as w; w.filterwarnings("ignore", "\nyour performance"); pd.DataFrame([None]).to_hdf("test.h5", "/data")'
,但这对我的用例来说非常不方便。我也可以解决根本问题,但这不是一项小任务)
解决方案
出现您的问题是因为PerformanceWarning
不是内置警告类别(此处列出)。
根据您的用例,您可以使用以下方法,但要小心,因为一些强硬的方法也可能会抑制有用的警告。
如果您想在从命令行运行脚本时忽略所有警告,您可以使用:
python -W ignore myscript.py
你的例子:
python -W ignore -c 'import pandas as pd; pd.DataFrame([None]).to_hdf("test.h5", "/data")'
在脚本内部,您可以使用:
import pandas as pd
import warnings
# Create your own warning filter
warnings.simplefilter(action='ignore', category=pd.errors.PerformanceWarning)
你的例子:
python -c 'import warnings; import pandas as pd; warnings.simplefilter(action='ignore', category=pd.errors.PerformanceWarning); pd.DataFrame([None]).to_hdf("test.h5", "/data")'
我建议使用第二种方法的一些变体,在这种方法中明确忽略您不想看到的特定警告。
推荐阅读
- javascript - SocketIO 的问题
- javascript - 在 Angular 中,当我不知道扩展名时如何加载图像?
- r - 使用 %in% 根据染色体和位置过滤行
- recurrence - 基本递归函数的运行时复杂性
- c# - 使用 MySql 数据库文件 (XAMPP) 发布 Visual Studio 软件
- python - 将字典列表转换为字典
- c# - 有没有办法在 Azure Data Lake Store 上使用 SSIS 处理“任何文件”?
- html - 如何使用 Bootstrap 4 垂直对齐列内的内容
- git - 在远程分支中查找文件的最后提交 ID
- python - 如何在 Tkinter 中将按钮连接到字典