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 :

Rechercher un fichier dans une arborescence


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut Rechercher un fichier dans une arborescence
    Bonjour,

    J'ai un problème concernant la récupération d'un fichier dans une arborescence, je m'explique, j'ai mon arborescence de la façon suivante:

    home > work > tech > tech1,tech2,tech3 et dans chaque répertoire (tech1,tech2 ou tech3) j'ai un fichier tools1.txt pour tech1, tools2.txt pour tech2 et ainsi de suite...
    L'idée est de récupérer le bon fichier en fonction que je choisisse de travailler avec tech1, tech2 ou tech3......J'ai fait le programme suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def Techno():
        import glob
        f = glob.glob("/home/work/tech/%(choix)s/*.txt")
        result = open(f % {'choix' : "tech1"}, mode = "r")
    l'idée étant de choisir le fichier à ouvrir en fonction du répertoire dans lequel on veut travailler......mon programme ne marche marche pas sa m'affiche "unsupported operand type(s) for %: 'list' and 'dict'.....s'y vous pouviez m'aidez svp

    merci d'avance

  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 778
    Points
    36 778
    Par défaut
    Salut,
    En français, vous voulez ouvrir le fichier "tools" correspondant au répertoire "tech" choisi. Si on commence par la fin, çà devrait ressembler à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = open(tools, "r")
    Reste à mettre ce qu'il faut dans la variable tools...
    A partir de la description:
    home > work > tech > tech1,tech2,tech3 et dans chaque répertoire (tech1,tech2 ou tech3) j'ai un fichier tools1.txt pour tech1, tools2.txt pour tech2 et ainsi de suite...
    Vos noms sont 'cablés': (tech1, tools1.txt), (tech2, tools2.txt), (tech3, tools2.txt)...
    Pourquoi passer par glob.glob qui vous retournera une liste de...
    open n'en demande pas tant et vous savez ce que vous voulez.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    alors au départ j'ai défini mon chemin comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fichier = "/home/work/tech/%(lib)s/tools1.txt" 
     
    def ChoixDuFichier():
         choix = "tech1"
         files = open(fichier % {'lib' : choix}, "r")
         print files.read()
    Concrètement se programme fonctionne lorsque j'ai le même motif c'est à dire que le nom du fichier soit tjr le meme dans chaque répertoire sauf que la c'est pas le cas.......J'ai éssayé de faire appel au fichier par extension en utilisant *.txt mais sa ne marche pas....

  4. #4
    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 778
    Points
    36 778
    Par défaut
    Certes!
    Mais est ce que le pattern:
    - "/home/work/tech/%(lib)s/tools1.txt"
    correspond à ce que vous dites.
    Je verrai plutôt
    - "/home/work/tech/tech%(choix)d/tools%(choix)d.txt"
    ou le nom du répertoire et celui du fichier à ouvrir dépendent du choix me semble plus 'en ligne'.

    Essayez avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pattern = "/home/work/tech/tech%(choix)d/tools%(choix)d.txt" 
    choix = 1
    print pattern % vars()
    Notez que je n'essaie que de traduire ce que vous racontez en code...
    Les réalités sont peut être différentes.

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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    oui c'est ce que j'ai fait mais en fait j'ai oublié de préciser que les fichiers sont plus du type: a_jc.txt(pour tech1), b_fc.txt(pour tech2) et c_th.txt(pour tech3)
    ...j'avais mis tools1.txt ect pour l'exemple dsl.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    et dans ce cas la il n'est plus possible de chercher dans le chemin les fichiers puisqu'il ne correspondent pas à un certain motif

  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 778
    Points
    36 778
    Par défaut
    L'informatique, c'est d'abord mettre en forme le problème à résoudre.
    Après on peut être "inventif" sur la répartion des informations et qu'est ce qui est fonction de...

    Voilà une autre façon de raconter (programmer) ce que vous dites:

    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
     
    class Choice2Files:
     
        def __init__(self, leaves=None, root=None):
            self.leaves = leaves
            self.root = root
     
        def __call__(self, c):
            leaf = os.path.join('tech%d' % (c+1), '%s.txt' % self.leaves[c])
            return os.path.join(self.root, leaf)
     
    if __name__ == '__main__':
        c2f = Choice2Files(leaves = ("a_jc", "b_fc", "c_th"), root = "\\home\\work\\tech")
        for c in range(len(c2f.leaves)):
            print 'choix: %d, name: %s' % ( c, c2f(c))
    En sortie, çà donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    choix: 0, name: \home\work\tech\tech1\a_jc.txt
    choix: 1, name: \home\work\tech\tech2\b_fc.txt
    choix: 2, name: \home\work\tech\tech3\c_th.txt
    Je trouve cela excessivement compliqué pour ce que çà fait, mais vous avez une liste de fichiers "a_jc", "b_fc", "c_th" dans la racine "\\home\\work\\tech"
    à rechercher dans le tech%d qui va bien en fonction du choix.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    En effet j'ai du mal à formuler ce que je veux réellement faire ( c'est un peu confidentiel c'est pour sa):

    j'ai ma liste de path suivante pour chaque techno(de vrai exemple ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Lab_path = "/home/work/techno/01/01_A/LAB/01_A_ET_5U3425TLB.lab"
    Lik_path = "/home/work/techno/01/01_A/LIK/01_A_ET_5U3425TLB.lik"
    fag_path = "/home/work/techno/01/01_A/FAG/01_A_ET_5U3425TLB.fag"
     
    Lab_path = "/home/work/techno/01/01_B/LAB/01_B_ET_5U3425TLB.lab"
    Lik_path = "/home/work/techno/01/01_B/LIK/01_B_ET_5U3425TLB_fc.lik"
    fag_path = "/home/work/techno/01/01_B/FAG/01_B_ET_5U3425TLB.fag"
    etc....il y a encore plusieurs techno de 01_A à 01_N

    donc si j'ai envi d'aller ouvrir Lab_path correspondant à la techno 01_A par exemple j'applique le programme suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #Je redéfini le path de la facon suivante:
    Lab_path = "/home/work/techno/01/%(lib)s/LAB/%(lib)s_ET_5U3425TLB.lab"
     
    def Techno():
        techno = "01_A"
        files = open(Lab_path % {'lib' : techno}, "r")
        t = files.read()
        files.close()
    et sa marche parfaitement bien sauf que pour Lik_path sa ne marche pas parsque le fichier ne porte pas exactement le même nom, voila pourquoi je demandé si il n'y avait pas un moyen d'utiliser l'extension des fichiers et pas le nom.

  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 778
    Points
    36 778
    Par défaut
    La question est de savoir s'il y a ou pas un pattern "utilisable".
    Avec les nouvelles informations que vous donnez, çà pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Lab_path = "/home/work/techno/01/%(techno)s/LAB/%(techno)s_*.lab"
    Lik_path = "/home/work/techno/01/%(techno)s/LIK/%(techno)s_*.lik"
    fag_path = "/home/work/techno/01/%(techno)s/FAG/%(techno)s_*.fag"
    Quelque soit la raison pour laquelle vous ne savez/pouvez pas trop formuler ce que vous voulez faire... il ne sera pas facile de vous aider.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    D'après vos réponse vous avez saisi mon problème je pense, j'ai utilisé l'extension "*.lik" mais j'obtiens comme résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/home/work/techno/01/01_A/LIK/01_A_*.lik"
    avec le programme que j'ai défini précédemment....mon problème depuis le début c'est que le "*.lik" ne fonctionne pas dans mon programme tous simplement

  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 778
    Points
    36 778
    Par défaut oops, get_name serait mieux avec return
    Ben maintenant on a des wildcards dans le nom, il faut remettre le glob.glob pour récupérer un "nom" qui existe.
    Genre:
    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
     
    import glob
    LAB_PATTERN = "/home/work/techno/01/%(techno)s/LAB/%(techno)s_*.lab"
    LIK_PATTERN = "/home/work/techno/01/%(techno)s/LIK/%(techno)s_*.lik"
    FAG_PATTERN = "/home/work/techno/01/%(techno)s/FAG/%(techno)s_*.fag"
     
     
    def get_name(pattern, techno):
        files = glob.glob(pattern % vars())
        assert len(files) is 1, "si >1 ou zero: revoir l'algo"
        return files[0]
     
    # usage
    techno = "XXXX"
    lab_file = get_name(LAB_PATTERN, techno)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    c 'est bon j'ai trouvé sa hier

    voila mon programme:

    Lab_path = "/home/work/techno/01/%(lib)s/LAB/
    Lik_path = "/home/work/techno/01/%(lib)s/LIK/
    fag_path = "/home/work/techno/01/%(lib)s/FAG/

    tech = 01_A
    path = Lab_path # or Lik_path or fag_path
    ext = "*.lab" # or "*.lik" or "*.fag"

    def techno(tech,path,ext):
    x = path %{'lib' : tech}
    concat = x + ext
    tree = glob.glob(concat)
    if tree != []:
    for elem in tree:
    return elem

    merci pour l'aide

Discussions similaires

  1. Find et Recherche de fichier dans une arborescence
    Par Lolitaaa dans le forum Unix
    Réponses: 1
    Dernier message: 04/03/2011, 12h51
  2. rechercher du texte dans une arborescence de fichier
    Par tibotibo69 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 24/08/2009, 11h47
  3. Compter le nombre de fichiers dans une arborescence
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 22/08/2007, 10h29
  4. Récupération de fichiers dans une arborescence
    Par bibilolo2 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 04/05/2007, 22h19
  5. chercher un fichier dans une arborescence
    Par diamonds dans le forum Entrée/Sortie
    Réponses: 15
    Dernier message: 16/03/2007, 14h27

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