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 :

Comparer deux arbo en ignorant certains dossiers


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut Comparer deux arbo en ignorant certains dossiers
    Bonjour à tous,

    Suite à mon problème initial "Comparer 2 arbo" j'ai un nouveau problème. J'aimerais comparer les arborescence mais en ignorant certains dossiers.

    Prenons cet exemple :

    dos1
    ---- 2010
    --------- file
    --------- file
    ---- 2011
    --------- file
    --------- file
    ---- 2012
    --------- file
    --------- file

    dos2
    ---- 2010
    --------- file
    --------- file
    ---- 2011
    --------- file
    --------- file
    ---- 2012
    --------- file
    --------- file
    En complétant mon code initial (présent dans le topic cité précédemment) j'aimerai pouvoir comparer seulement les dossiers 2011 et 2012. Mais je ne vois vraiment pas comment faire

    Je vous remercie pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut,

    Déjà il faudrait savoir si vous voulez comparez:
    - dos1/2011 avec dos2/2011 et dos1/2012 avec dos2/2012 ou
    - dos1 et dos2 en excluant le s/répertoire 2010.
    Puis définir comment passer cela en paramètre à ce que vous avez déjà.
    Enfin faire le code ad hoc.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Avec mon code :

    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
    def _report(ctx): 
     
        #Si les fichier s ne sont présents que sur le NAS
        logging.info(ctx.left)
        if ctx.right_only:
            ctx.right_only.sort()
            #On ajoute le fichier à la liste
            for file in ctx.right_only:
                _right.append(str(ctx.right) + "\\" + file)
     
        #Pour tous les fichiers présents seulement sur le local ou bien qui diffèrent
        #On ajout le fichier à la liste 
        for name in ctx.left_only + ctx.diff_files:
               _left.append(os.path.join(ctx.left, name))
     
     
    def _report_full(ctx):
        _report(ctx)
        for sd in ctx.subdirs.values():
            _report_full(sd)
     
     
    def report_full(a, b):
        '''
        Fonction qui retourne les fichiers qui diffèrent entre deux répertoires
        '''
        global _left, _right
        _left = []
        _right = []
        _report_full(filecmp.dircmp(a, b))
        return _left, _right
    Ca compare les 2 répertoires entre eux. Maintenant j'aimerai que ça compare les 2 répertoires mais sans comparer les dossier 2010.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par Leniouns Voir le message
    Ca compare les 2 répertoires entre eux. Maintenant j'aimerai que ça compare les 2 répertoires mais sans comparer les dossier 2010.
    Certes! Mais qu'allez vous indiquer à "report_full" pour qu'il comprenne cela?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Justement aucune idée... Il faudrait peut être que je repense moi même tout un algo

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par Leniouns Voir le message
    Justement aucune idée... Il faudrait peut être que je repense moi même tout un algo
    Pour l'instant, il s'agit de définir une interface, i.e. comment allez vous dire ce que vous voulez à "report_full". Tant que cela n'a pas été fait, penser "algo" est prématuré...


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

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    En fait pour donner une meilleure explication, c'est que mes dans mes deux répertoires il y a énormément de données et de sous répertoires. C'est très très long à comparer les deux arbo. Du coup j'aimerai comparer seulement les dossiers/fichiers qui ne datent pas de plus de 5mois par exemple.

    EDIT : Lorsque dans mon code je fais _report_full(filecmp.dircmp(a, b))

    Je vais voir dans dircmp et je trouve

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def __init__(self, a, b, ignore=None, hide=None): # Initialize
            self.left = a
            self.right = b
            if hide is None:
                self.hide = [os.curdir, os.pardir] # Names never to be shown
            else:
                self.hide = hide
            if ignore is None:
                self.ignore = ['RCS', 'CVS', 'tags'] # Names ignored in comparison
            else:
                self.ignore = ignore
    Donc à l'appel de dircmp puis-je mettre les dossiers à ignorer ?

    Re-EDIT : Quand je rajoute '2010' et '2011' dans self.ignore la fonction ne compare pas les dossiers ayant pour noms 2010 et 2011

    Maintenant il va falloir que je trouve une solution pour les mois car en fait j'ai après :

    2012
    --1
    --2
    --3
    --4
    --5
    --6
    --7


    Et j'aimerai juste comparer le mois en cours et le mois précédent. Ca me parait lourd de mettre 1,2,3,4,5 dans self.ignore surtout que par la suite il faudra changer (comme pour les années mais c'est moins récurent).

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Pour l'instant, vous êtes toujours en train de définir ce que vous voulez.

    La structure de vos répertoires semblant être de la forme "YYYY/M", vous pourriez, effectivement, vous basez la dessus pour ne comparer le mois courant et le mois précédent.

    Dans ce cas, le plus simple serait de lancer 2 comparaisons "sous" report_full fonction de la date courante ou d'une date passé en paramètre.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    En fait la structure de mes répertoires est de la forme :

    Dossier
    ---Sous dossier 1
    ------- Dos
    ----------- YYYY
    ----------------M
    ----------------M
    ---------------- ...
    ---Sous dossier 2
    ------- Dos
    ----------- YYYY
    ----------------M
    ----------------M
    ---------------- ...


    Donc je ne vois pas trop comment faire pour qu'il ne compare que certains dossiers...

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Tant que vous ne voyez pas comment écrire un algorithme "en français", pas la peine de regarder ce que fait ou pas le code existant.

    Si on part de:
    Du coup j'aimerai comparer seulement les dossiers/fichiers qui ne datent pas de plus de 5mois par exemple.
    La structure de vos dossiers étant:
    Dossier/Sous dossier/Dos/YYYY/M

    Cela se ramène à "filter" les dossiers dont la date (YYYY, M) est inférieure à 5 mois. Puis de comparer "ces dossiers là" entre source et destination.

    Les questions étant:
    • Est ce que cela correspond à ce que vous voulez faire?
    • Plus important est ce que cela correspond à l'utilisation des dossiers?
    note: Pourquoi 5 mois plutôt que "la dernière fois qu'on à effectué la comparaison"? i.e est-on sûr que les dossiers datés des mois précédents n'ont pas été modifiés?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Je veux comparer les dossier de la forme :

    Dossier/Sous dossier/Dos/YYYY/M avec M qui représente le mois en cours (en chiffre, par exemple 03 pour Mars).
    Je veux seulement comparer les dossiers de l'année en cours et du mois en cours (ainsi que du mois précédent).
    Cela revient à comparer les dossiers de la forme Dossier/Sous dossier/Dos/2012/06 et Dossier/Sous dossier/Dos/2012/07 pour ce mois ci.

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    ok, pour l'instant, il faut construire une liste de répertoires qui "matchent" un pattern à retravailler.
    Allez voir si ce que propose le module glob convient.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    pour parcorir une arborenscence il exite une méthode du module os:

    os.walk(top, topdown=True, onerror=None, followlinks=False)
    qui permet de parcourir tous les dossiers sous-dossier et fichiers contenus dans top,
    si topdown=False l'algorithme fonctionne a l'envers et il parcoure des plus profondes racines j'usqu'a l'argument top (ce qui est pratique pour effacer des fichiers contenus dans un répertoire afin d'effacer celui-ci).

    Mias assez de théorique: admettont que Dossier contienne tous les sous dossiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import os
    to_iterate=os.walk('Dossier')
    for z,y,x in to_iterate :
      # z donne le chemin courant
      # y Liste des sous-dossiers de z
      # x liste contenant tous les fichiers de z
    Après libre a toi d'utiliser le module time pour faire des structures conditionnelles dans la boucle de résultat... et de maîtriser le parcours de os.walk()
    Bon python a toi.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Lorsque j'écris ce code (avec local qui est la racine de mon chemin) j'obtiens tous les fichiers que je veux. Donc par la suite je peux faire la même chose avec le l'autre arborescence. Mais par la suite comment comparer les deux listes sans que ce soit redondants (sans parcourir maintes et maintes fois la liste).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glob.glob(local + "\\*\\*\\" + date.getCurrentYear() + "\\" + date.getCurrentMonth() + "\\*")
    Je vous remercie de votre aide

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    ouch l'écriture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glob.glob(local + "\\*\\*\\" + date.getCurrentYear() + "\\" + date.getCurrentMonth() + "\\*")
    fait tellement mal au yeux qu'elle empêche de penser.

    Ajoutez un peu de "verbe":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def get_pattern(root, year, month):
         s = r'%(root)s/*/*/%(year)d/%(month)d/*' 
         return os.path.normpath(s % vars())
     
    pattern = get_pattern(local, date.getCurrentYear(), date.getCurrentMonth())
    glob.glob(pattern)
    r'%(root)s/*/*/%(year)d/%(month)d/*' récupère la liste de tous les fichiers
    pourquoi ne pas seulement récupérer la liste des répertoires r'%(root)s/*/*/%(year)d/%(month)d' puis les donner à manger à report_full?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Oui c'est que je pensais faire.

    Seulement avec ça je me retrouve avec deux listes. Comment faire pour donner à report_full les éléments 2 par 2 et qui concordent bien ?

  17. #17
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par Leniouns Voir le message
    Seulement avec ça je me retrouve avec deux listes. Comment faire pour donner à report_full les éléments 2 par 2 et qui concordent bien ?
    Je ne comprends pas les 2 listes.
    Vous avez un répertoire "source" et un répertoire "cible"
    glob retourne une liste de répertoires "source" qui seront des tuples de la forme (source, *, *, YYYY, M) - sans les '*' et avec les YYYY et M qui vont bien -.
    Puis vous comparez les (source, *, *, YYYY, M) avec les (cible, *, *, YYYY, M)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    glob retourne une liste plutôt.

    J'ai donc une liste de la forme local\\*\\*\\YYYY\\MM. Ce qu'il faut faire c'est plutôt parcourir la liste et pour chaque répertoire enlever "local" et mettre "cible" pour ensuite pouvoire comparer non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    local = directoryLocal + "\\PDGS(ESRIN-FTP)" 
            nas = directoryNas + "\\PDGS(ESRIN-FTP)"
            pattern = directory.get_pattern(local, date.getCurrentYear(), "06")
            listSrc = glob.glob(pattern)
            for rep in listSrc:
                regex = re.compile('\\PDGS\(ESRIN-FTP\).*')
                repN = regex.search(rep)
                nas = directoryNas + "\\" + repN.group(0)
                list = directory.report_full(rep,nas)

  19. #19
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Salut le python trieur de fichiers,
    J'ai pas lu le premier Post mais vous ne vous compliquez pas la vie: car si tu a deux listes a comparer tu peut simplement utiliser la primitive map():
    map(...)
    map(function, sequence[, sequence, ...]) -> list

    Return a list of the results of applying the function to the items of
    the argument sequence(s). If more than one sequence is given, the
    function is called with an argument list consisting of the corresponding
    item of each sequence, substituting None for missing values when not all
    sequences have the same length. If the function is None, return a list of
    the items of the sequence (or a list of tuples if more than one sequence).
    A utiliser par exemple avec une fonction personnalisée et les deux listes comme arguments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>>a=[1,2]
    >>>b=[0,2]
    >>>def compare(elt_1,elt_2) :
    ...  if elt_1 == elt_2 :
    ...    return True # ou ce que tu veut
    ...  else :
    ...   return False # ou ce que tu  veut
     
    >>>map(compare,a,b)
    [False, True]
    Ou je n'ai rien compris et si c'est le cas je vous pris de m'en excuser.

Discussions similaires

  1. [OL-2010] Comparer deux dossiers de contacts Outlook et en retirer
    Par virokannas.ahti dans le forum Outlook
    Réponses: 2
    Dernier message: 01/10/2014, 12h35
  2. Comparer deux dates en ignorant l'heure
    Par Romz_Java dans le forum Général Java
    Réponses: 14
    Dernier message: 02/04/2013, 11h19
  3. comparer deux dossier par le nom des fichiers
    Par nclsbiz dans le forum Windows 7
    Réponses: 3
    Dernier message: 25/11/2011, 11h09
  4. Créer un patch en comparant deux dossiers
    Par mamelouk dans le forum Windows
    Réponses: 0
    Dernier message: 26/10/2010, 12h13
  5. Comparer deux dossiers avec sauvegarde
    Par Doo89 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 16/02/2009, 13h38

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