Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparer répertoires et fichiers différents.

Présence de répertoires et fichiers.

Sujet résolu
    19 juillet 2024 à 1:17:02

    Bonjour à tous.

    J'ai trouvé un code sur internet pour récupérer les répertoires et fichiers différents entre deux répertoires sources (que j'ai un peu modifié).

    Le code fonctionne, par contre quand je veux récupérer le nom de fichiers et répertoires présent dans un répertoire qui n'est pas présent dans l'autre répertoire source, celà ne fonctionne pas. La fonction de récursivité ne va pas plus loin qu'un niveau de récursivité. Je sais pas si je suis assez clair ? Ce que je voudrais c'est récupérer tous les répertoires et fichiers peux importe leur niveau de profondeur, mais je n'ai aucune idée de comment appliquer celà. Après de nombreuses recherche infructueuses, si pouviez m'aider ce serait grandement apprécié.

    Débutant en python.

    Merci à vous.

    Je vous mets le code:

    #! /usr/bin/python3
    # -*- coding:Utf-8 -*-
    
    import os
    import sys
    
    def compare(rep_source, rep_cible, dossier):
        
        test_titre_1 = False    #Témoin écriture ligne séparateur de dossier
        test_titre_2 = False    #Témoin écriture du titre
        rep_source = os.path.normpath(os.path.join(rep_source, dossier))
        rep_cible = os.path.normpath(os.path.join(rep_cible, dossier))
        lst_rep_source = os.listdir(rep_source)
        lst_rep_cible  = os.listdir(rep_cible)
        
        
        #Ensemble des dossiers/fichiers présents dans SOURCE et absents dans CIBLE
        lst_difference_cible = sorted(set.difference(set(lst_rep_source), set(lst_rep_cible)))
    
        #Ensemble des dossiers/fichiers présents dans CIBLE et absents dans SOURCE
        lst_difference_source = sorted(set.difference(set(lst_rep_cible), set(lst_rep_source)))
    
        #Ensemble des fichiers présents dans CIBLE et dans SOURCE
        lst_intersection = sorted(set.intersection(set(lst_rep_source), set(lst_rep_cible)))
        
    
        #Recherche des dossiers/fichiers absents dans CIBLE
        if lst_difference_cible:
            texte = "Dossiers/fichiers non présents dans le répertoire: " + rep_cible
            test_titre_1 = recherche_absent(lst_difference_cible, rep_source, test_titre_1, texte)
    
        #Recherche des dossiers/fichiers absents dans SOURCE
        if lst_difference_source:
            texte = "Dossiers/fichiers non présents dans le répertoire: " + rep_source
            recherche_absent(lst_difference_source, rep_cible, test_titre_1, texte)
           
        #Appel récursif de recherche des sous dossiers (Répertoire niveau -1 a -n)
        if lst_intersection:
            for dossier in lst_intersection:
                if os.path.isdir(os.path.join(rep_source, dossier)):
                    compare(rep_source, rep_cible, dossier)
                    
    def recherche_absent(lst_difference, rep, test_titre_1, texte):
        if lst_difference:
    
            if not test_titre_1:  #Si la ligne séparateur de dossier n'a pas été écrite
                fic.write("\n" + "O-" * 80 + "\n")
                test_titre_1 = True
    
        fic.write("\t" + texte + "\n")
    
        for element in lst_difference:
            if os.path.isfile(os.path.join(rep, element)):
                fic.write("\t\tFICHIER absent: " + element + "\n")
            else:
                fic.write("\t\tDOSSIER absent: " + element + "\n")
    
        return test_titre_1
            
            
    
    
    
    if __name__ == '__main__':
        rep_source = input("Selectionnez le dossier SOURCE: ")
        
    
        rep_cible = input("Selectionnez le dossier CIBLE: ")
    
        
        if rep_source == rep_cible:
            print("Comparaison de répertoires", "ERREUR !!!.\n\nLes répertoires <SOURCE> et <CIBLE> sont identiques.")
            sys.exit()
            
        with open("Compare_Repertoires.txt", "w") as fic:
            fic.write("\nCOMPARAISON DE REPERTOIRES (Attention !!!  <Dossier> est différent de <dossier>)\n")
        
            dossier = ""
            
            compare(rep_source, rep_cible, dossier)
        
        
        
        print("Comparaison de répertoires", "Traitement terminé.\n\nLe fichier <Compare_Repertoires.txt> a été crée.")
            
        
        
    
    



    -
    Edité par Yvon_apprenti 19 juillet 2024 à 1:47:14

    • Partager sur Facebook
    • Partager sur Twitter
      19 juillet 2024 à 11:28:04

      Bonjour,

      Déjà, pour lister les dossiers, fichiers et sous-dossiers d'un répertoire donné, tu peux faire ça;

      import glob
      import os
      
      for path, subdirs, files in os.walk(os.getcwd()):
          print('\nDossier: ', path)
          for name in files: print('Fichier: ', os.path.join(path, name))



      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2024 à 22:06:25

        Merci Phil_1857 pour ton aide si rapide.

        Entre temps j'ai réussi à le faire autrement, par contre ta solution est plus courte, donc je vais tester et garder en tête ce module glob et la méthode walk que je ne connaissaient pas.

        Merci encore et bonne journée.

        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2024 à 11:27:23

          Avec mon code, pas besoin de récursivité

          Et au lieu de faire des print, on peut mettre tout ça dans des listes et

          ensuite comparer les listes pour voir les répertoires et fichiers différents

          J'avais importé le module glob, mais il ne sert à rien, en fait

          Pour ton info, un exemple utilisant glob :

          import glob
          
          print('\nListe des fichiers du répertoire courant avec glob :')
          for f in glob.glob("*.*"): print(f)



          -
          Edité par Phil_1857 21 juillet 2024 à 11:32:20

          • Partager sur Facebook
          • Partager sur Twitter

          Comparer répertoires et fichiers différents.

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown