#python #pandas
Вопрос:
Несмотря на то, что в моем файле Rout есть end_str в точном формате, я все еще получаю уведомление по электронной почте. Он вообще не должен отправлять мне электронное письмо, потому что технически ошибки нет. Почему это происходит?
import pandas as pd
import smtplib
from email.message import EmailMessage
df = pd.read_fwf(r'Service-Now-Data.Rout', header=None)
end_str = '#--- END ---------------------------------------------------------------------------------------------------'
cols_to_check = ["0"]
def email_alert(subject,body,to):
msg = EmailMessage()
msg.set_content(body)
msg['subject'] = subject
msg['to'] = to
user = "DataScienceScriptAlerts@cfi.com"
msg['from'] = user
server = smtplib.SMTP("pmixx36.corp.hhhegroup.com", 2525)
server.starttls()
#server.login(user,password)
server.send_message(msg)
server.quit()
if __name__ == '__main__':
for col in cols_to_check:
if not df[0].str.contains(end_str).any():
body = "There Service-Now-Data.R script in xxx had errors on the last execution" col "."
print(body)
email_alert("Service-Now-Data failure alert",body,"jtl.t@cfi.com")
содержимое df явно имеет end_str
df[0]
Out[3]:
0 R version 4.0.4 (2021-02-15) -- "Lost Library ...
1 Copyright (C) 2021 The R Foundation for Statis...
2 Platform: x86_64-w64-mingw32/x64 (64-bit)
3 R is free software and comes with ABSOLUTELY N...
397 >
398 > #--- END -----------------------------------...
399 >
400 > proc.time()
401 user system elapsed
402 76.10 4.92 374.51
Name: 0, Length: 403, dtype: object
Как вы можете видеть, end_str существует в df, и ниже по-прежнему указано значение false
print(df[0].str.contains(end_str))
0 False
397 False
398 False
399 False
400 False
401 False
402 False
Name: 0, Length: 403, dtype: bool
Комментарии:
1. может быть, вы пропустили символ новой строки или что-то в этом роде? кроме того, основываясь на том, что я только что прочитал, строка
end_str
не обязательно должна совпадать с другой строкой, просто должна быть та же скороговорка, что означает, что вы могли бы попробовать сократить своюend_str
2. кроме того, основываясь на том, что я только что прочитал, end_str не обязательно должен совпадать с другой строкой, просто должна быть такая же скороговорка, что означает, что вы можете попробовать сократить свой end_str, также попробуйте распечатать
repr(string)
, гдеstring
значение, с которым вы сравниваете, вы действительно пытались напечатать то, чтоdf[0].str
есть илиdf[0]
?3. В чем смысл цикла, если вы никогда им не пользуетесь
col
?4. @Barmar когда я печатаю(df[0].str.содержит(end_str)), он все равно говорит False для строки, в которой существует end_str
5. Тогда, очевидно, он на самом деле не содержит
end_str
. Возможно, число-
неверно.
Ответ №1:
Я не могу воспроизвести вашу ошибку
import pandas as pd
import numpy as np
end_str = '#--- END ---------------------------------------------------------------------------------------------------'
df = pd.DataFrame([end_str])
print(df[0].str.contains(end_str))
0 True
Name: 0, dtype: bool
Это означает, что ваш end_str не совпадает с тем, что содержится в файле
Я бы посоветовал дважды проверить вашу конечную строку в файле маршрута, чтобы убедиться, что нет никаких разрывов. Или сократите строку, чтобы просто «ЗАКОНЧИТЬ»
import pandas as pd
import numpy as np
end_str = 'END'
df = pd.DataFrame(['#--- END ---------------------------------------------------------------------------------------------------'])
print(df[0].str.contains(end_str))
0 True
Name: 0, dtype: bool
Комментарии:
1. Ответы следует использовать для решения проблемы.
2. @Barmar Не будет ли вторая часть рассматриваться как решение?
3. Я полагаю, хотя это может иметь ложные срабатывания, так как есть другие строки, содержащие
END
, которые не должны совпадать.4. @Barbar первая часть показывает, что, если исходная строка содержится, она будет соответствовать. Следовательно, что-то в этой строке нарушает
end_str
шаблон. Самый простой способ исправить это-сократитьend_str
, возможно, если это создаст ложные совпаденияend_str = '#--- END'
. Решение заключается в сокращении совпадения или исправлении файла.5. Я чувствую, что мы немного углубляемся в семантику. Моя цель состояла в том, чтобы показать, что
str.contains
это ведет себя так, как ожидалось, и исключение сокращения крайних случаевend_str
исправит это. Однако я буду иметь это в виду в будущем.