5 votes

Comment envoyer une alerte par courriel via python si une chaîne particulière manque dans mon fichier ?

Je suis nouveau dans le monde de Python et de smptplib. J'essaie d'envoyer une alerte par courriel si "#--- END -----------------------------------" n'est pas détecté dans mon fichier. Je suis jusqu'ici capable d'envoyer un email s'il y a une chaîne non numérique dans le fichier mais je ne sais pas comment créer une fonction qui permet d'envoyer un email si une chaîne n'existe pas ou est manquante.

import pandas as pd
    import smtplib
    from email.message import EmailMessage

df = pd.read_fwf(r'factadwords.Rout', header=None)

    df
    Out[31]: 
                                                          0
    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...
    4     You are welcome to redistribute it under certa...
                                                    ...
    1337  > #--- END -----------------------------------...
    1338                                                  >
    1339                                      > proc.time()
    1340                               user  system elapsed
    1341                              73.89    7.00 1208.56

    [1342 rows x 1 columns]

def email_alert(subject,body,to):
    msg = EmailMessage()
    msg.set_content(body)
    msg['subject'] = subject
    msg['to'] = to

    user = "xx@gmail.com"
    msg['from'] = user
    password = "clqdgqyfrlccisynd"

    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()
    server.login(user,password)
    server.send_message(msg)

    server.quit()

if __name__ == '__main__':

    for col in cols_to_check:
        if not df[col].apply(lambda x: isinstance(x, (int, float))).all():
            body = "There is no END in the file" + col + "."
            print(body)
            email_alert("Hey",body,"xx.t@cinset.com")

Que dois-je changer ou ajouter dans mon code ?

3voto

Victor Douet Points 151

Vous pouvez utiliser :

df[0].str.contains(end_str).any()

Il vérifiera si l'une des lignes de la colonne 0 contient votre chaîne END. Si au moins une d'entre elles contient la chaîne requise, elle renvoie True. Si aucune ligne ne contient la chaîne, elle renvoie False.

Vous pourriez faire quelque chose comme ça :

import pandas as pd

end_str = '#--- END -----------------------------------'

df = pd.read_fwf(r'factadwords.Rout', header=None)

if not df[0].str.contains(end_str).any():
    print("There is no END in the file")
    email_alert("Hey",body,"xx.t@cinset.com")

pandas.Series.str.contains : https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html pandas.DataFrame.any : https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.any.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X