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 :

[python 2.7] aide sur la fonction glob


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Par défaut [python 2.7] aide sur la fonction glob
    bonsoir,

    J'ai besoin de faire une recherche d'extension *.txt dans tous les sous-répertoires d'un répertoire.

    si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import glob
     
    cherche = glob.glob('/home/pi/*.txt')
    Je n'ai que les .txt du repertoire /pi

    si je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import glob
     
    cherche = glob.glob('/home/pi/*/*.txt')
    je n'ai que les .txt de tous les sous répertoires un niveau en dessous /pi.

    Mais je voudrais trouver tous les .txt à partir de /pi, jusqu'à 4 ou 5 niveaux de sous-répertoires en une seule commande, et que biensûr il me renvoie le chemin complet de l'arborescence pour chaque .txt.

    Est-ce possible avec glob ?

    Merci !

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Il faut faire de la recherche récursive : tu trouveras pas mal d'infos sur ton moteur de recherche favori en tapant "recherche récursive python".

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Et oui, c'est bien dommage, mais glob ne fait pas de récursion. Par contre, os.walk en fait, mais ne supporte pas les jokers (genre "*.txt").

    On peut, bien sûr, coder la récursion en utilisant os.listdir et fnmatch, et c'est ce qu'il faudrait faire en cas d'exigences particulières. Pour des cas courants, on peut tout simplement utiliser os.walk (qui trouve tout), et filtrer les noms de fichiers trouvés avec le module fnmatch

    Voilà un petit code qui fait ça (Python 3):

    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
    import os
    from fnmatch import filter
     
    def selectfichiers(repertoire, jokers='*'):
        """retourne la liste des fichiers (+chemin) de l'arborescence
           qui matchent avec les jokers
           repertoire: le répertoire racine de l'arborescence
           jokers: motif (séparés par ";" s'il y en a plusieurs)
        """
        jokers = jokers.split(";") # conversion de la chaine en liste
        fichiers = []
        for rep, sousreps, fics in os.walk(repertoire):
            for joker in jokers:
                for fichier in filter(fics, joker):
                    fichiers.append(os.path.join(rep, fichier))
        return fichiers
    Et voilà un exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    repertoire = r"C:\Python34\Lib"
    jokers = "*.jpg;*.jpeg;*.png;*.tif;*.tiff"
     
    for fichier in selectfichiers(repertoire, jokers):
        print(fichier)

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    C'était demandé, et glob permet depuis Python 3.5 de faire des recherches récursives avec le motif "**".

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par __dardanos__ Voir le message
    C'était demandé, et glob permet depuis Python 3.5 de faire des recherches récursives avec le motif "**".
    et positionné le nouveau paramètre recursive à True.

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

  6. #6
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Par défaut
    Wa merci, j'en n'attendais pas tant !

    En même temps je n'aurais jamais trouvé tout seul.
    J'ai quasiment compris tout le code j'ai juste un trou noir sur le "for rep, sousreps, fics in". J'avais déjà fait un "for i, rep in enumerate(sequence) par exemple, pour récupérer l'indice, mais là avec 3 qui se suivent je suis un peu largué.
    Le code ne marche pas chez moi, mais je suis en train de cherché ^^

    Je reviens pour dire quand ça marche ;-)

    Merci !

Discussions similaires

  1. Réponses: 11
    Dernier message: 13/12/2011, 17h41
  2. Où trouver l'aide sur les fonctions de l'API Windows ?
    Par psidonio dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 08/11/2005, 14h28
  3. [CR]Aide sur les fonction de date et plage de date.
    Par Job dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 08/11/2005, 09h19
  4. Besoin d'aide sur une fonction
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/08/2005, 17h40
  5. Besoin d'aide sur les fonction d'interbase
    Par BOUBOU81 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/11/2004, 10h00

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