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 :

Récupérer une partie précise d'un chemin


Sujet :

Python

  1. #1
    Membre régulier
    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
    Points : 94
    Points
    94
    Par défaut Récupérer une partie précise d'un chemin
    Bonjour à tous,

    Je voulais savoir comment faire pour pouvoir récupérer une partie d'un chemin.

    Par exemple j'ai un fichier qui a le chemin suivant :

    c:/exemple/test/f1

    Je voudrais récupérer le chemin à partir de exemple (exemple exclut). Donc récupérer test/f1 sachant que mes chemins commencent toujours par c:/exemple.

    Je vous remercie

  2. #2
    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,

    Après avoir découpé le chemin en liste de segments via os.path.split, chemin.split(os.sep), vous reconstruisez les bouts qui vous intéressent avec os.path.join.

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

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Hello,
    Dans un contexte moins général que ce que suggère ton titre, si je me base sur
    Je voudrais récupérer le chemin à partir de exemple (exemple exclut). Donc récupérer test/f1 sachant que mes chemins commencent toujours par c:/exemple.
    je pense que os.path.relpath pourrait te simplifier les choses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
    [GCC 4.4.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> path = '/opt/example/test/f1'
    >>> start = '/opt/example'
    >>> os.path.relpath(path, start)
    'test/f1'
    >>>

  4. #4
    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,

    Sous Windows, il faut aussi retirer la lettre du drive quand il y en a une.

    On peut créer une petite fonction qui "éclate" le chemin et renvoie la liste de ses éléments. C'est d'ailleurs dommage que ça n'existe pas déjà. Une fois fait, il est facile de recomposer le chemin souhaité avec os.path.join:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def eclatechemin(chemin):
        """éclate un chemin Windows et renvoie la liste de ses éléments"""
        drive, chemin = os.path.splitdrive(chemin)
        L = [drive]
        while chemin not in [u'', u'\\', u'/']:
            chemin, elem = os.path.split(chemin)
            L.insert(1, elem)
        return L
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    c = u"C:/Python27/Lib/site-packages/PyQt4/plugins/designer"
    print os.path.join(*eclatechemin(c)[2:])
    Lib\site-packages\PyQt4\plugins\designer
    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

  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 tyrtamos Voir le message
    On peut créer une petite fonction qui "éclate" le chemin et renvoie la liste de ses éléments. C'est d'ailleurs dommage que ça n'existe pas déjà.
    chemin est "str", chemin.split(os.sep) devrait faire çà non?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    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 wiztricks

    Citation Envoyé par wiztricks Voir le message
    chemin est "str", chemin.split(os.sep) devrait faire çà non?
    A condition d'utiliser le séparateur qui va avec l'OS: '\' pour Windows. Ce qui n'est pas le cas dans l'exemple fourni. J'aurais bien aimé que ç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

  7. #7
    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 tyrtamos Voir le message
    A condition d'utiliser le séparateur qui va avec l'OS: '\' pour Windows. Ce qui n'est pas le cas dans l'exemple fourni. J'aurais bien aimé que ça marche.
    os.sep est le séparateur.
    Je vous embête parce que je n'ai pas encore compris le "problème".
    Ce qui en soit n'est pas important puisque si vous avez une solution.

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

  8. #8
    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
    Oh, le problème est très simple: vouloir séparer les éléments du chemin donné en exemple "c:/exemple/test/f1" sous Windows avec os.sep ne marche pas, parce que le séparateur de Windows est '\' et non '/'. Ça ne marchera que si on écrit: "c:\exemple\test\f1".
    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

  9. #9
    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
    Citation Envoyé par tyrtamos Voir le message
    Oh, le problème est très simple: vouloir séparer les éléments du chemin donné en exemple "c:/exemple/test/f1" sous Windows avec os.sep ne marche pas, parce que le séparateur de Windows est '\' et non '/'. Ça ne marchera que si on écrit: "c:\exemple\test\f1".
    Ah ben oui... je n'avais pas compris ce soucis là.
    os.path.normpath remet les chose d'aplomb.
    Mais c'est "nt" spécifique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import os
    def split(path):
        if os.name == 'nt':
            path = os.path.normpath(path)
        return path.split(os.sep)
     
    c = "C:/Python27/Lib/site-packages/PyQt4/plugins/designer"
    print (os.path.join(*split(c)[2:]))
    # => Lib\site-packages\PyQt4\plugins\designer
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    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
    Effectivement, c'est plus simple: bravo!

    Mais pourquoi "spécifique nt"? ça marche très bien sous Linux. Il est seulement mentionné dans la doc un éventuel problème avec les liens symboliques.
    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

  11. #11
    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
    Citation Envoyé par tyrtamos Voir le message
    Mais pourquoi "spécifique nt"? ça marche très bien sous Linux. Il est seulement mentionné dans la doc un éventuel problème avec les liens symboliques.
    Pourquoi effectuer l'opération sur toute les plate-formes alors qu'elle n'est (pour l'instant) nécessaire que sous "nt" ?
    Si c'était un impôt, ponctionner sur une base "large" ferait du sens.
    Ici, rien à gagner juste du temps CPU à éviter de gaspiller quand c'est possible.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre régulier
    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
    Points : 94
    Points
    94
    Par défaut
    Bonjour à tous,

    désolé j'ai eu des soucis d'internet. J'ai parcouru rapidemment vos réponses car j'ai programmé un petit bout de code qui marche.

    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
     def copyFile(self, listLocal, nas, local):
            #listLocal étant la liste des fichiers/répertoires présents ou différents dans c: et non dans d:
            #local est le répertoire racine (c:\pat\rep) présent dans c: 
            #nas est le répertoire racine (c:\rep) présent dans d:
            '''
            Fonction copiant les fichiers locaux vers les dossier NAS
            '''
     
            #Pour tous les fichiers présents en local et non présent dans les NAS
            for file in listLocal:
                #On récupère le chemin du fichier sans le lecteur
                pathFile = (os.path.splitdrive(file))[1]
                #On récupère la racine du local sans le lecteur
                start = (os.path.splitdrive(local))[1]
                #On enlève la racine du local au chemin du fichier
                path = os.path.relpath(pathFile, start)
                #On concactène le chemin du fichier (sans la racine du local) à la racine de la NAS
                pathFileNas = nas + "\\" + path
                #Si le chemin n'existe pas dans la NAS et que le fichier en question est un répertoire
                if (not os.path.exists(pathFileNas) and os.path.isdir(file)):
                    logging.info("Copie du dossier " + file + " vers " + pathFileNas)
                    shutil.copytree(file, pathFileNas)
                else:
                    logging.info("Copie du fichier " + file + " vers " + pathFileNas)
                    shutil.copy(file,pathFileNas)
    Qu'en pensez vous ? Merci de votre participation

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Hello,
    Je n'ai pas de windows sous la main pour en être sûr, mais je pense que la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                #On concactène le chemin du fichier (sans la racine du local) à la racine de la NAS
                pathFileNas = nas + "\\" + path
    serait plus portable sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                #On concactène le chemin du fichier (sans la racine du local) à la racine de la NAS
                pathFile = os.path.normpath(os.path.join(nas, path))

  14. #14
    Membre régulier
    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
    Points : 94
    Points
    94
    Par défaut
    En effet cela marche très bien et est du coup portable

  15. #15
    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,
    Cette discussion faisant suite à celle-ci, les questions sont plutôt:
    • pourquoi ne pas faire la copie au moment ou l'on a toutes ces informations?
    • et si on veut déconnecter les deux pourquoi ne pas remonter plus d'informations, i.e. plutôt qu'une liste "simple" de fichiers retourner un couple (src, dst) ou src serait le fichier à copier, dst le répertoire "cible".

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

  16. #16
    Membre régulier
    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
    Points : 94
    Points
    94
    Par défaut
    En fait c'est assez brouillant dans ma tête c'est pour ça que je sépare en faisant plusieurs fonctions. Comment vois tu la chose toi ?

  17. #17
    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
    Citation Envoyé par Leniouns Voir le message
    En fait c'est assez brouillant dans ma tête c'est pour ça que je sépare en faisant plusieurs fonctions. Comment vois tu la chose toi ?
    Je ferais plutôt 1 (dans report). En fait, plutôt que "report", je passerait un "callable" en paramètre à la fonction appelante qui pourrait être "modifiée" suivant le besoin.
    Mais je comprend qu'il soit plus simple d'aller en (2).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Récupérer une partie d'un chemin absolu
    Par oursquetaire dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/05/2009, 11h59
  2. [VBA]Récupérer une partie du chemin d'un fichier
    Par poivre dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/04/2007, 19h34
  3. comment récupérer une partie d'une chaine
    Par yannickrohel dans le forum C
    Réponses: 7
    Dernier message: 27/02/2006, 10h31
  4. récupérer une partie d'un char*
    Par r0d dans le forum C
    Réponses: 5
    Dernier message: 10/11/2005, 14h14
  5. Récupérer une partie d'une chaine de caractère
    Par Cyborg289 dans le forum Langage
    Réponses: 5
    Dernier message: 07/07/2005, 14h06

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