IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

problème boucle for if else priorisation conditions


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Points : 6
    Points
    6
    Par défaut problème boucle for if else priorisation conditions
    Bonjour

    je sollicite votre aide car je bute sur des imbrications de conditions (boucle for + if elif else).
    J'ai fait un petit programme qui a pour but de récupérer la valeur de l'espace disque windows utilisé (converti en %) pour ensuite le comparer à un seuil défini .

    en fonction de cette comparaison je souhaite si le seuil critique d'espace occupé est dépassé déclencher 2 conditions mais avec une priorisation , à savoir si seuil critique < espace disque occupé alors "supprimer tous les répertoires (préfixés en "*_SAV" plus ancien de 3 jours en priorité (dans mon script les 3 jours sont simulés par 2min (120s) pour accélérer le test) .

    par contre je souhaite que si il n'y a pas de dossier > 3 jours qu'il supprime dans ce cas ceux étant plus récents que 3 jours.

    pour ces 2 cas j'y parviens sans souci par contre j'ai une enieme condition dans laquelle je veux que si il y a un mélanges de dossiers > 3 jours et < 3 jours seulement ceux > à 3 jours soient supprimés et que les inférieurs à 3 jours (les plus récents) eux soient conservés.

    j'ai essayé un nombre incalculable de combinaisons (if elif else, if else if else, etc mais sans succès)

    voici ma version de script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import os, glob, time, stat
    from os import path
    from shutil import disk_usage
    import shutil
     
    #commande pour déterminer les espaces disque total, utilisé et libre
     
    total_bytes, used_bytes, free_bytes = disk_usage(path.realpath('C:'))
     
    #affichage des résultats de la commande précédente en GigaBytes
     
    #print("il y a", str(round(total_bytes / 1000000000, 0)) + "Go au total")
    #print("il y a", str(round(used_bytes / 1000000000, 0)) + "Go d'utlisé")
    #print("il y a", str(round(free_bytes / 1000000000, 0)) + "Go de libre")
     
    # récuperation de l'espace utilisé dans la variable
     
    TOTAL_SPACE = (round(total_bytes / 1000000000, 0))
    USED_SPACE = (round(used_bytes / 1000000000, 0))
     
    #calcul de l'espace utilisé exprimé en pourcent
     
    PERCENT_SPACE_USED = (USED_SPACE/TOTAL_SPACE) * 100
    print("il y a", round(PERCENT_SPACE_USED), '%', "d'espace disque utilisé")
     
    #définition du seuil critique d'espace disque utilisé et de l'ancienneté des dossiers à supprimer
     
    SEUIL = 10
    THREE_DAYS_AGO = time.time() -120
     
    #boucle de comparaison du résultat de la 1ere commande avec le seuil défini
    #suppression des répértoires avec extension "_SAV" supérieurs à 3 jours lorsque le seuil critique a été dépassé
     
    for dir in glob.glob(r'C:\TEST\*_SAV'):
     
        #date de création des dossiers
     
     mtime = os.path.getmtime(dir)
     
     if  mtime > THREE_DAYS_AGO and SEUIL <= PERCENT_SPACE_USED:
          shutil.rmtree(dir, ignore_errors=True)
          print("absence de dossiers > 3 jours => suppression dossiers < 3 jours")
     
     elif mtime < THREE_DAYS_AGO and SEUIL <= PERCENT_SPACE_USED:
         shutil.rmtree(dir, ignore_errors=True)
         print("dossiers > 3 jours supprimés")
     
     else:
            print("le seuil n'est pas atteint")



    merci de votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 142
    Points
    142
    Par défaut
    Bonjour.

    Si on suit ton principe, il faut boucler deux fois :
    - une première fois pour voir s'il y a un dossier > 3 jour.
    - SI il y a un dossier > 3 jour on supprime les dossiers > jours.
    - SINON on supprime tous les dossiers.

    Après il y a moyen de trier les éléments d'un dossier par date. Et dans ce cas, tu peux te contenter de regarder la date du premier dossier pour déterminer ce que tu supprimes

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    en fait j'ai peut être pas été tres clair j'avoue que c'est un peu tordu mais les conditions sont les suivantes

    seuil critique non atteint => aucune action

    seuil critique atteint + uniquement dossiers > 3 jours => suppression de ces dossiers

    seuil critique atteint + uniquement dossiers < 3 jours => suppression de ces dossiers

    seuil critique atteint + mélange de dossiers < et > 3 jours => suppression uniquement des dossiers superieurs à 3 jours

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par niko77114 Voir le message
    en fait j'ai peut être pas été tres clair j'avoue que c'est un peu tordu mais les conditions sont les suivantes

    seuil critique non atteint => aucune action

    seuil critique atteint + uniquement dossiers > 3 jours => suppression de ces dossiers

    seuil critique atteint + uniquement dossiers > 3 jours => suppression de ces dossiers

    seuil critique atteint + mélange de dossiers < et > 3 jours => suppression uniquement des dossiers superieurs à 3 jours


    Sur le principe, ça ne change pas grand chose :
    1. Tu boucles sur les dossiers pour lire leur date.
    2. SI tu as un mélange tu boucles sur les dossiers pour supprimer ceux qui ont plus de 3 jours.
    SINON tu supprimes tout.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par niko77114 Voir le message
    seuil critique atteint + mélange de dossiers < et > 3 jours => suppression uniquement des dossiers superieurs à 3 jours
    Pour savoir si vous êtes dans ce cas là, il faut récupérer tous les dossiers ou au moins un certain nombre pour savoir savoir si on vous êtes dans la condition "mélange" ou pas.
    Ce n'est qu'après que vous savez quels sont les dossiers à détruire.
    Et effectivement, si vous sautez cette étape là, c'est infaisable.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Points : 6
    Points
    6
    Par défaut help
    Bonjour desolé du retard dans ma réponse et merci pour votre retour mais je ne comprends pas comment faire en sorte d'isoler le cas "mélange" et encore moins comment faire en sorte si je suis dans ce cas de ne supprimer que mes dossiers plus anciens de 3 jours

    j'ai fait cette boucle qui liste et classe les répértoires souhaités

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for dir in sorted(glob.glob(r'C:\TEST\*_SAV'), key=os.path.getmtime):
        print(dir)
        mtime=os.path.getmtime(dir)
    ça m'affiche bien les répértoire dans l'ordre mais ça ne m'affiche pas les dates donc je ne peux pas récupérer cette donnée pour m'appuyer dessus.....

    j'ai fait cette boucle en pensant que si la date des répértoires présents était > 3 jours dans ce cas ceux-ci sont supprimés et que si des repertoires inférieurs à 3 jours n'existent pas d'emblée dans ce cas il supprime directement ceux < 3 jours mais étant une boucle les 2 cas finissent toujours par être validés et il supprime tout même lorsqu'il y a un mélange...

    bref je ne sais plus quoi faire pour dissocier mes cas :-(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    THREE_DAYS_AGO = time.time() -120 (-120 simulant mes 3 jours)
     
    for dir in sorted(glob.glob(r'C:\TEST\*_SAV'), key=os.path.getmtime):
        print(dir)
        mtime=os.path.getmtime(dir)
     
        if mtime < THREE_DAYS_AGO and SEUIL >= PERCENT_SPACE_USED:
          shutil.rmtree(dir, ignore_errors=True)
          print("dossiers > 3 jours supprimés")
     
    else:
        if mtime > THREE_DAYS_AGO and SEUIL >= PERCENT_SPACE_USED:
         shutil.rmtree(dir, ignore_errors=True)
        print("dossiers < 3 jours supprimés")

  7. #7
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par niko77114 Voir le message
    en fait j'ai peut être pas été tres clair j'avoue que c'est un peu tordu mais les conditions sont les suivantes

    seuil critique non atteint => aucune action

    seuil critique atteint + uniquement dossiers > 3 jours => suppression de ces dossiers

    seuil critique atteint + uniquement dossiers < 3 jours => suppression de ces dossiers

    seuil critique atteint + mélange de dossiers < et > 3 jours => suppression uniquement des dossiers superieurs à 3 jours
    Que constate-t-on dans cela ?
    C'est qu'il faut séparer anciens et récents dossiers dans 2 listes séparées.

    Soit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import os, glob, time, shutil
     
    # Pour tests
    SEUIL = PERCENT_SPACE_USED = 1
     
    THREE_DAYS_AGO = 120
     
    # seuil critique atteint
    if SEUIL >= PERCENT_SPACE_USED :
     
        now = time.time()
        # Ceux de plus de 3 jours
        old_dirs = []
        # Ceux inférieurs à 3 jours
        recent_dirs = []
        # Récupération des répertoires
        # dirs = glob.glob('test_savs/*_SAV')
        dirs = glob.glob('C:\TEST\*_SAV')
        # Parcours des répertoires
        for dir_ in dirs :
            mtime = os.path.getmtime(dir_)
            if now - mtime > THREE_DAYS_AGO :
                old_dirs.append(dir_)
            else :
                recent_dirs.append(dir_)
     
        dirs_to_remove = []
        # mélange de dossiers < et > 3 jours => suppression uniquement des dossiers superieurs à 3 jours 
        if recent_dirs and old_dirs :
            print('présences de récents et anciens répertoires')
            print('suppressions des anciens')
            dirs_to_remove = old_dirs
        else :
            #  uniquement dossiers > 3 jours => suppression de ces dossiers
            # ET
            # uniquement dossiers < 3 jours => suppression de ces dossiers
            types = 'anciens' if old_dirs else 'récents'
            print('seulement présence de répertoires', types)
            print('suppression des', types, 'répertoires')
            dirs_to_remove.extend(recent_dirs)
            dirs_to_remove.extend(old_dirs)
     
        # Suppressions
        for dir_ in dirs_to_remove :
            print('sup', dir_)
    Je n'ai pas testé plus que ça, à toi de faire des tests plus élaborés et affiner au cas où ça ne correspond pas bien au comportement désiré.
    Note : dir est fonction standard de python, mieux vaut ne pas l'écraser par une variable.
    Note2 : Il est possible que dans le else il soit affiché des prints erronés au cas où il n'y a aucun répertoire SAV.
    Le temps ronge l'amour comme l'acide.

Discussions similaires

  1. Problème boucle for
    Par revsys dans le forum Delphi
    Réponses: 20
    Dernier message: 24/05/2007, 15h50
  2. Problème boucle for
    Par rouliane dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2006, 14h37
  3. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  4. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo