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 :

pb os.walk ou glob


Sujet :

Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut pb os.walk ou glob
    Bonjour,
    j'ai un petit souci de compréhension avec os.walk.
    J'ai tenté avec glob mais sans plus de succès.
    Je cherche à supprimer des éléments dans mon rep_a_nettoyer qui sont déjà présents dans mon rep_propre.
    Voici ce que j'ai fait mais tout est supprimé.
    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
    import os
    import os.path
    import fnmatch
     
    rep_propre = '/media/marco5/Disque-4To/Informatique/python_marco/yt-playlist/2th'
    rep_a_nettoyer = '/media/marco5/Disque-4To/Informatique/python_marco/yt-playlist'
    type_fichier = ['*.mp3']
     
     
    liste_doublons=[]            
     
    for root1, repertoires1, fichiers1 in os.walk(rep_propre):
        # Parcours récursif des répertoires
        for chaque_type1 in type_fichier:
            for fichier1 in fnmatch.filter(fichiers1, chaque_type1):
                liste_doublons.append(fichier1)
     
     
     
    for root2, repertoires2, fichiers2 in os.walk(rep_a_nettoyer):
        for chaque_type2 in type_fichier:
            for fichier2 in fnmatch.filter(fichiers2, chaque_type2):
                if fichier2 in liste_doublons:
                    print(fichier2)
                    rep = root2.split('/')[:-1]
                    fich_sup = "/".join(rep)+"/"+fichier2
    #                print(fich_sup)
                    os.remove(fich_sup)
                    print(fich_sup, ' supprimé !')
    Je sais que ce n'est pas compliqué mais je bloque.

  2. #2
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Bon, j'ai fini par trouver une solution, pas forcément élégante mais bon
    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
    import os
    import os.path
    import fnmatch
     
    rep_propre = '/media/marco5/Disque-4To/Informatique/python_marco/yt-playlist/2th'
    rep_a_nettoyer = '/media/marco5/Disque-4To/Informatique/python_marco/yt-playlist'
    type_fichier = ['*.mp3']
     
     
    liste_doublons=[]            
     
    for root1, repertoires1, fichiers1 in os.walk(rep_propre):
        # Parcours récursif des répertoires
        for chaque_type1 in type_fichier:
            for fichier1 in fnmatch.filter(fichiers1, chaque_type1):
                liste_doublons.append(fichier1)
    #print(liste_doublons)
     
     
    for elem in os.listdir(rep_a_nettoyer):
        if os.path.isdir(elem) == False and elem in liste_doublons:
            print(elem)
            fich_sup = os.path.abspath(elem)
            print(fich_sup)
            os.remove(fich_sup)
            print(fich_sup, ' supprimé !')
    Je suis preneur d'améliorations éventuelles si pas trop compliquées.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne suis pas sûr d'avoir compris le problème, mais j'aime bien os.walk pour au moins 3 raisons:
    - possibilité de gérer des erreurs (alors que glob.glob est silencieux en cas d'erreur)
    - possibilité de parcourir en récursif en top-down (par défaut) et en bottom-up
    - possibilité d'éviter de rentrer dans certains sous-répertoires: voir ci-dessous

    De plus, dans les dernières versions de Python, il est rapide puisqu'il utilise os.scandir.

    Lors du parcours de l'arborescence avec os.walk (en top-down), on peut toujours supprimer l'exploration de certains sous-répertoires: il suffit de les supprimer dans la liste des sous-répertoires dans la boucle qui les cite.

    Petit exemple: je liste les fichiers de mon Python 3.7, mais je ne veux pas rentrer dans le sous-répertoire "demo" du répertoire "Tools":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import os
     
    repertoire = r"E:\Programmes\Python37"
     
    erreurs = []
    for repert, sousreps, fics in os.walk(repertoire, onerror=erreurs.append):
        for fic in fics:
            fichier = os.path.join(repert, fic) # ajout du chemin
            #...
            print(fichier) # traitement pour le fichier trouvé
            #...
        if "demo" in sousreps:
            sousreps.remove("demo")
    Si on veut éviter un sous-répertoire connu avec son chemin complet, il faudra ajouter aussi les chemins aux éléments de sousreps pour la comparaison.

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Merci Tyrtamos, c'est la piste que j'avais choisi au début mais cela me dégageait tous mes fichiers, car pas de sous-répertoire exclu.
    J'essaierai de regarder à nouveau cela.
    En fait j'ai un répertoire avec des fichiers mp3 et dans ce répertoire un sous-répertoire qui contient également des fichiers mp3.
    Lorsque les fichiers sont présents, je souhaite les supprimer du répertoire mais pas du sous-répertoire.
    J'avais fais un truc qui fonctionnait il y a qqs années mais je l'ai égaré (si ça se trouve, c'est toi qui m'avais aidé). Je vais creuser avec ton histoire de sous-répertoire exclu.

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Bon, j'ai repris un peu mais je vois bien ce qui ne colle pas, c'est que les sous-répertoires que j'exclus ou pas ne sont pas utilisés ensuite...
    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
    import os
    import os.path
    import fnmatch
     
    rep_propre = '/media/marco5/Disque-4To/Informatique/python_marco/yt-playlist/2th'
    rep_a_nettoyer = '/media/marco5/Disque-4To/Informatique/python_marco/yt-playlist'
    type_fichier = ['*.mp3']
     
     
    liste_doublons=[]            
     
    for root1, repertoires1, fichiers1 in os.walk(rep_propre):
        # Parcours récursif des répertoires
        for chaque_type1 in type_fichier:
            for fichier1 in fnmatch.filter(fichiers1, chaque_type1):
                liste_doublons.append(fichier1)
    #print(liste_doublons)
     
    # Liste des sous-répertoires à traiter
    rep_source=[rep_a_nettoyer]
    # Liste des sous-répertoires à exclure
    rep_exclus = [rep_propre]
    # liste des types de fichiers à effacer
    type_fichier = ['*.mp3']
     
     
    cpt=0 # compteur fichiers supprimés
     
    for dossier in rep_source:
        for root, repertoires, fichiers in os.walk(dossier):
            repertoires=tuple(x for x in repertoires if x not in rep_exclus)
            for rep in repertoires:
                if rep in rep_exclus:
                    repertoires.remove(rep)
     
            # Parcours récursif des types
            for chaque_type in type_fichier:
                # Parcours récursif des répertoires
                for fichier in fnmatch.filter(fichiers, chaque_type):
                    # affiche les fichiers supprimés
                    print(fichier, ' supprimé')
                    #efface les fichiers
    #                os.remove(os.path.join(root, fichier))
                    # incrémente le compteur de fichiers supprimés
                    cpt+=1            
     
    print(cpt, ' fichiers supprimé(s) !')

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Il me semble qu'il y a un truc qui ne colle pas. Dans ta condition pour exclure un sous-répertoire, tu compares rep (nom d'un sous-répertoire sans son chemin) avec rep_exclus (sous-répertoire avec son chemin)

    il faudrait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                if os.path.join(root, rep) in rep_exclus:
                    repertoires.remove(rep)

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    J'avais effectivement oublié des choses.
    Je suis rendu là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for dossier in rep_source:
        for root, repertoires, fichiers in os.walk(dossier):
    #        repertoires=tuple(x for x in repertoires if x not in rep_exclus)
            for rep in repertoires:
                print(repertoires)
                print(rep)
                print(root)
                if os.path.join(root,rep) in rep_exclus:
                    repertoires.remove(rep)
                print(repertoires)
    La sortie que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ['2th']
    2th
    /media/marco5/Disque-4To/Informatique/python_marco/yt-playlist
    []
    Ensuite, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            for fichier in repertoires:
                print(fichier)
    Je n'obtiens rien alors que je m'attends à y trouver des fichiers...

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Citation Envoyé par marco056 Voir le message
    Je n'obtiens rien alors que je m'attends à y trouver des fichiers...
    "repertoires" est la liste des sous-répertoires sans leur chemin: ce ne sont donc pas des fichiers.

    Tu as encore besoin d'aide, ou c'est résolu?

  9. #9
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Ok, je comprends mieux. Je vais y réfléchir encore...
    Je bosse ce matin, je vois cela après.

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Bon, j'ai fait cela et cela semble fonctionner :
    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
    import os
    import os.path
    import fnmatch
     
    rep_propre = '2th'
    rep_a_nettoyer = '/media/marco5/Disque-4To/Informatique/python_marco/yt-playlist'
    type_fichier = ['*.mp3']
     
     
    liste_doublons=[]            
     
    for root1, repertoires1, fichiers1 in os.walk(rep_propre):
        # Parcours récursif des répertoires
        for chaque_type1 in type_fichier:
            for fichier1 in fnmatch.filter(fichiers1, chaque_type1):
                liste_doublons.append(fichier1)
     
     
    # Liste des sous-répertoires à traiter
    rep_source=[rep_a_nettoyer]
    # Liste des sous-répertoires à exclure
    rep_exclus = [rep_propre]
    # liste des types de fichiers à effacer
    type_fichier = ['*.mp3']
     
     
    cpt=0 # compteur fichiers supprimés
     
    for dossier in rep_source:
        for root, repertoires, fichiers in os.walk(dossier):
            for rep in repertoires:
                if os.path.join(rep) in rep_exclus:
                    repertoires.remove(rep)
     
            for fich in fichiers:
                if fich in liste_doublons:
                    os.remove(os.path.join(root, fich))
                    cpt+=1            
     
    print(cpt, ' fichiers supprimé(s) !')

Discussions similaires

  1. glob & récursivité : étrange problème
    Par Mat_F dans le forum Langage
    Réponses: 3
    Dernier message: 27/07/2006, 12h23
  2. Probleme de tyle Glob avec ma classe
    Par mobscene dans le forum Langage
    Réponses: 4
    Dernier message: 23/05/2006, 23h06
  3. glob() ne marche pas ?
    Par FoxLeRenard dans le forum Langage
    Réponses: 5
    Dernier message: 15/03/2006, 12h32
  4. Voir le contenue d'un tableau glob
    Par goblin dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2006, 09h56
  5. [glob]afficher la sous arborescence d'un repertoire
    Par antigone dans le forum Langage
    Réponses: 5
    Dernier message: 24/08/2005, 14h50

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