Python脚本检测到Rout文件含指定end_str仍误发告警邮件问题
问题原因及解决办法
核心原因
- 待匹配行存在额外前缀:你打印的df[0]第398行内容为
> #--- END -----------------------------------...,行首多了R交互模式的提示符>,但你定义的end_str以#开头,前缀不匹配自然无法命中。 - 固定宽度读取导致内容截断:你使用
pd.read_fwf()读取文件,该方法会自动推断列宽,若推断的列宽小于实际行长度,末尾的横杠会被截断,和你写的完整版长end_str无法匹配。 - str.contains默认配置的潜在问题:
str.contains默认开启正则解析,即使本例无特殊正则字符,也可能因不可见字符、横杠实际数量和你定义的end_str不一致导致匹配失败。
修复方案
- 简化匹配规则:不需要写全END后所有横杠,把
end_str缩短为#--- END即可,规避横杠数量不匹配的问题。 - 调整匹配逻辑:清理字符串前后空白、关闭正则匹配,避免额外字符干扰:
if not df[0].str.strip().str.contains('#--- END', regex=False, na=False).any():
- 更换文件读取方式:改用read_csv读取整行内容,避免固定宽度读取的截断问题:
# 用不存在的分隔符让pandas把整行内容都读为第一列 df = pd.read_csv(r'Service-Now-Data.Rout', header=None, sep='|^|', engine='python')
内容的提问来源于stack exchange,提问作者NewInPython
相关产品推荐
相关产品推荐

