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 :

Comment lister que certains fichiers d'un dossier


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Par défaut Comment lister que certains fichiers d'un dossier
    Bonjour,
    Je débute en python et je souhaiterai savoir si il existe une fonction permettant de lister les fichiers d'un répertoire ne contenant qu'un certain type de sous chaine dans le nom (par exemple *toto*).
    Je souhaite remplir une liste avec le nom des fichiers sans l'extension pour ensuite effectuer des traitements/tri... pour chaque élément de ma liste.

    Pour l'instant je ramène tous les fichiers du dossier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for root, directories, files in os.walk(rep):
        for file in files:
            # Le nom du fichier sans extension
           fichier=os.path.splitext(file)[0]
           listfic.append(fichier)
    mais je ne sais pas comment filtrer mes élément en fonction de ma sous chaine. Je veux le faire pendant l'itération pour ne pas ramener inutilement des milliers de fichiers dans ma liste.

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 914
    Billets dans le blog
    7
    Par défaut
    Bonjour,
    Avec pathlib:
    Le code ci_dessous listera tous les répertoires contenant l'expression toto contenu dans le répertoire courant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from pathlib import Path
     
    p=Path('.')
    répertoires = [x for x in p.iterdir() if x.is_dir() and 'toto' in str(x)]
    print(répertoires)
    édit: Je viens de m'apercevoir que la demande était de lister des fichiers pas des répertoires....

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    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 800
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par olivier15250 Voir le message
    mais je ne sais pas comment filtrer mes élément en fonction de ma sous chaine.
    Il s'agit d'un traitement de tes éléments ramenés pas os.walk(). Tu dois donc, comme tout programmeur, programmer ce traitement, via un algorithme et des instructions représentant cet algorithme, style for ext in extension puis if ext in file etc (ps: pas super lisible de nommer une variable "files" et une autre "file").

    Tu peux toutefois te faire aider. Certains outils sont spéfiquement dédiés à l'introspection de chaines. Par exemple le module re te permet de définir des règles grammaticales appelées "regex" (un langage particulier) qui simplifient ensuite la recherche qui pourra se faire via une simple re.search().
    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
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Par défaut
    Citation Envoyé par olivier15250 Voir le message
    Bonjour,
    Je débute en python et je souhaiterai savoir si il existe une fonction permettant de lister les fichiers d'un répertoire ne contenant qu'un certain type de sous chaine dans le nom (par exemple *toto*).
    Je souhaite remplir une liste avec le nom des fichiers sans l'extension pour ensuite effectuer des traitements/tri... pour chaque élément de ma liste.

    Pour l'instant je ramène tous les fichiers du dossier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for root, directories, files in os.walk(rep):
        for file in files:
            # Le nom du fichier sans extension
           fichier=os.path.splitext(file)[0]
           listfic.append(fichier
    )

    mais je ne sais pas comment filtrer mes élément en fonction de ma sous chaine. Je veux le faire pendant l'itération pour ne pas ramener inutilement des milliers de fichiers dans ma liste.

    Merci de votre aide

    Merci , J'ai fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for file in Path(rep).glob("*toto*"):
        print(PurePosixPath(file).stem)
        listfic.append(file)

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 032
    Par défaut
    Bonjour,

    Il y a aussi le module glob avec sa fonction glob ou iglob.

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

    Ok avec fred1599 pour glob, et pour moi, c'est le plus simple car il intègre les motifs "wildcard":

    Exemple pour avoir une liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from glob import glob
    fichiers = glob(r"C:\Python39\Tools\pynche\*.txt")
    print(fichiers)
     
    ['C:\\Python39\\Tools\\pynche\\html40colors.txt', 'C:\\Python39\\Tools\\pynche\\namedcolors.txt', 'C:\\Python39\\Tools\\pynche\\webcolors.txt', 'C:\\Python39\\Tools\\pynche\\websafe.txt']
    Pour avoir les fichiers un par un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from glob import iglob
    for fichier in iglob(r"C:\Python39\Tools\pynche\*.txt"):
        print(fichier)
     
    C:\Python39\Tools\pynche\html40colors.txt
    C:\Python39\Tools\pynche\namedcolors.txt
    C:\Python39\Tools\pynche\webcolors.txt
    C:\Python39\Tools\pynche\websafe.txt
    Et glob a des capacités étonnantes puisqu'on peut lui faire parcourir des arborescences (le répertoire et tous ses sous-répertoires). J'avais un peu exploré le sujet ici:
    https://www.developpez.net/forums/d1...ive-glob-glob/

    Pour moi, le seul défaut de glob (qui pourrait être aussi une qualité), c'est qu'il reste silencieux dans le cas d'une erreur de lecture. Mais au moins, il se s'arrête pas... Quand je veux gérer les erreurs, je préfère os.walk qui est vraiment plus complet (mais plus compliqué).

    [edit]: effectivement, comme le dit Hominidé, glob va renvoyer aussi les noms des répertoires qui satisfont le motif wildcard.
    Si on veut ne retenir que les fichiers, le code avec iglob devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from glob import iglob
    import os
    for fichier in iglob(r"C:\Python39\Tools\pynche\*.txt"):
        if os.path.isfile(fichier):
            print(fichier)

  7. #7
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 914
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par olivier
    Merci , J'ai fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for file in Path(rep).glob("*toto*"):
        print(PurePosixPath(file).stem)
        listfic.append(file)
    écrit ainsi, glob() va attraper le nom des fichiers et le nom des répertoires comprenant l'expression 'toto'...

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/02/2010, 14h51
  2. Réponses: 6
    Dernier message: 25/03/2008, 22h50
  3. Réponses: 4
    Dernier message: 29/08/2006, 18h02
  4. N'afficher que certains fichiers
    Par azorol dans le forum Langage
    Réponses: 5
    Dernier message: 03/04/2006, 15h22
  5. [XML]Comment tester que mon fichier XML est comme ceci?
    Par Devil666 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/06/2005, 13h41

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