Несмотря на то, что в моем файле есть строка, которую я ищу, я все равно получаю электронное письмо с ошибкой через python

#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 исправит это. Однако я буду иметь это в виду в будущем.