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èmes de sous-répertoires


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Problèmes de sous-répertoires
    Bonjour,
    J'ai écrit le code ci-dessous pour déplacer automatiquement dans les répertoires et sous-répertoires les fichiers ayant le même nom (ou une partie seulement) que le répertoire.
    Il fonctionne très bien pour les répertoires étant à la racine mais pas pour les sous-répertoires. Je sèche un peu car je pensais que os.walk traversait l'ensemble de l'arborescence. Si vous voyez d'où vient le bug, je suis preneur. Merci de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def moveFiles2Folder():
        root_path = lien vers mon répertoire de départ
        for (root, dirs, files) in os.walk(root_path):
            for dir in dirs :
                for file in files :
                        fileX = os.path.splitext(file)[0]
                        if fileX in dir :
                            shutil.copy(os.path.join(root_path,file),os.path.join(root_path, dir))

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans le parcours récursif, files et dirs sont les noms des fichiers et des sous-répertoires du répertoire root. La double boucle for est donc fausse. Un simple print permettrait de le vérifier.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Phlam54 Voir le message
    je pensais que os.walk traversait l'ensemble de l'arborescence.
    Exact
    Citation Envoyé par Phlam54 Voir le message
    Si vous voyez d'où vient le bug, je suis preneur
    Tu fais ta jointure de noms sur root_path. Or root_path c'est la racine de départ de l'arborescence, ce n'est pas le dossier en cours de traitement.
    Si par exemple tu pars de "/var" mais que tu descends dans "/var/log", la copie des fichiers qui s'y trouvant (ex /var/log/messages) doit se faire à partir de "/var/log" et non "/var"

    Accessoirement, moi j'aurais mis "root_path" en paramètre de la fonction et non codé en dur dans ladite fonction.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Merci des réspones mais...
    Merci de vos réponses. Désolé, je suis un peu lent à la comprenette : j'ai modifié le code d'après vos remarques. Pour la double boucle, je ne vois pas comment m'en passer pour itérer sur les fichiers et les répertoires...Les fichiers sont bien copiés mais uniquement dans les répertoires se trouvant à la racine, pas dans les sous répertoires... Et quand je fais des print pour m'assurer que mes chemins sont OK, pour moi ils le sont...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def moveFiles2Folder(root_path):
        for (root, dirs, files) in os.walk(root_path):
            for dir in dirs :
                for file in files :
                    fileX = os.path.splitext(file)[0]
                    if fileX in dir:
                        shutil.copy(os.path.join(root,file),os.path.join(root, dir))

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Les fichiers de la liste files NE se trouvent PAS dans les sous-répertoires dirs.

    Fais un print juste après la ligne de os.walk pour voir les valeurs de root, dirs et files et tu comprendras comment ça marche.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ben oui, les fichiers de la liste files ne se trouvent pas dans les sous répertoires puisqu'ils se trouve à la racine et que le but du jeu est justement de les faire migrer vers les sous-répertoires. Mon print sur le root me ramène les répertoires, le print sur les files les fichiers et sur les dirs les répertoires. Aussi, je ne comprends toujours pas où ça coince.

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je crois que je n'avais pas bien compris ce que tu cherchais à faire.

    J'ai relu ton 1er message, et je vois pourquoi ça ne marche pas.

    root_path est la racine de l'arborescence. Elle représente le début de la recherche, et ne bouge pas pendant la recherche.

    Dans chaque boucle for, os.walk examine de façon récursive chacun des sous-répertoires de l'arborescence dont il donne l'adresse:root, et son contenu: files et dirs.

    Mais si dans une boucle donnée (donc dans un sous-répertoire donné root) tu veux copier l'un des fichiers (de la liste files) dans l'un des sous-répertoires (de la liste dirs):
    - le fichier que tu veux copier a pour adresse os.path.join(root, file)
    - et tu le copies dans os.path.join(root, dir)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shutil.copy2(os.path.join(root, file), os.path.join(root, dir))
    En utilisant root_path au lieu de root, tu restes au 1er niveau de l'arborescence. C'est ce qu'avait dit Sve@r avec d'autres mots.

    Par ailleurs, je te suggère d'utiliser copy2 qui copie en plus certains paramètres des fichiers. Et si tu veux que ce soit un déplacement, il faut en plus supprimer le fichier copié de son emplacement d'origine.

    Il reste qu'en changeant l'arborescence tout en la parcourant, je ne sais pas ce que ça va donner: à tester!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Merci d'avoir pris le temps de me répondre de façon aussi précise.
    Ca ne marche pas mais comme tu le dis, cela vient sans doute du fait du changement de l'arborescence tout en la parcourant. Je vais donc essayer de passer autrement : aligner tous les répertoires à la racine, déplacer tous les fichiers (puisque cela fonctionne) puis bouger les répertoires (avec un sutil.move) en fonction d'une liste csv me donnant la hiérarchie.
    cordialement

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Tu pourrais aussi enregistrer dans une liste toutes les opérations de déplacement à faire, et les faire ensuite, une fois sorti de la recherche os.walk.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Oui, excellence idée, c'est même mieux si je fais comme cela pour pouvoir tracer les déplacements.
    Merci.

Discussions similaires

  1. problème de sous-répertoires
    Par Black_Layer dans le forum Langage
    Réponses: 2
    Dernier message: 23/04/2013, 23h31
  2. [SEAM] problème de navigation & sous répertoires
    Par pClement dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 30/05/2008, 10h37
  3. Problème d'include et sous-répertoires
    Par didou038 dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2006, 10h46
  4. Réponses: 7
    Dernier message: 12/09/2006, 14h22
  5. fichier .bat : problèmes avec des sous-répertoires
    Par aymron dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 09h33

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